gpt4 book ai didi

c++ - 为什么数组分配后的堆这么大

转载 作者:太空狗 更新时间:2023-10-29 20:06:40 26 4
gpt4 key购买 nike

我有一个非常基本的应用程序,归结为以下代码:

char* gBigArray[200][200][200];
unsigned int Initialise(){
for(int ta=0;ta<200;ta++)
for(int tb=0;tb<200;tb++)
for(int tc=0;tc<200;tc++)
gBigArray[ta][tb][tc]=new char;
return sizeof(gBigArray);
}

该函数返回 32000000 字节的预期值,大约为 30MB,但在 Windows 任务管理器中(当然它不是 100% 准确)给出的内存(专用工作集)值为大约 157MB。我已通过 SysInternals 将应用程序加载到 VMMap 中并具有以下值:

我不确定 Image 是什么意思(在类型下列出),尽管它的值与我的预期无关。对我来说,真正让事情变得糟糕的是堆值,这是表面上巨大尺寸的来源。

我不明白这是为什么?根据this answer如果我理解正确的话,gBigArray 将被放置在数据或 bss 段中——但是我猜测每个元素都是一个未初始化的指针,它将被放置在 bss 段中。那么为什么堆值会比所需的值大得愚蠢呢?

最佳答案

如果您知道内存分配器的工作原理,这听起来并不傻。他们跟踪分配的 block ,因此有一个字段存储大小和指向下一个 block 的指针,甚至可能是一些填充。一些编译器在调试版本中的分配区域周围放置保护空间,因此如果您在分配区域之外或之前写入,程序可以在您尝试释放分配空间时在运行时检测到它。

关于c++ - 为什么数组分配后的堆这么大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6783014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com