c - 分配了一些内存后,我无法计算我分配的内存的正确大小。我不知道为什么
问题描述
分配了一些内存后,我无法计算我分配的内存的正确大小。系统告诉我我已经分配了 2GBytes,但我的代码告诉我我刚刚分配了 119 MBytes。我不知道出了什么问题。
#include <stdio.h>
#include <stdlib.h>
int main(void){
long long size = 0;
while(malloc(1) != NULL){
size = size + 1;
}
long long res = size>>20;
printf("%d MBytes\n",res);
scanf("%d",&size);
return 0;
}
解决方案
代码必须维护数据结构malloc
,free
跟踪它给你的每个内存块。让我们假设每块内存返回一个 16 字节的数据结构malloc
。你说你分配了 119 MB,因为你分配了 1 字节块,这表明你有 124780544 个块。如果每个块有 16 字节的开销,那就是 124780544 x 16 = 1996488704 字节的开销。124780544 + 1996488704 = 2121269248,或者正好是 2 GB。
(这并不能证明您的系统实际上为每个返回的块使用了 16 个字节的开销——它可能比这更复杂——但结果肯定是有启发性的。)
道德是分配大量的小内存块可能非常浪费。
如果您将测试程序更改为一次分配 1k 块,您可能会得到更令人满意的结果。
推荐阅读
- ios - 如何在缩放事件(iOS)上触发图像 CSS @media?
- android - System.err:javax.net.ssl.SSLPeerUnverifiedException:主机名 XXX 即使在添加网络安全配置后也未验证
- azure - 无法在 Azure Devops 服务中获取 TFS 用户权利
- r - 如何从R中的密度范围内选择数据
- r - 变量名列表的非标准评估
- python - python中A1符号单元格值的参数化
- spring-data-jpa - 我正在尝试将“spring-data-jpa-datatables”作为 maven 依赖项引入我的项目,但是在启动服务器时遇到了其他几个错误
- c# - 在继续之前检查前两个字符的 return 语句
- c# - 如何在 WPF 视图中获取无效值
- reactjs - 动态加载组件以从外部 url 响应本机应用程序