【发布时间】:2011-10-10 14:42:59
【问题描述】:
我有一个非常基本的应用程序,可以归结为以下代码:
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 是什么意思(列在 Type 下),尽管它的值与我的预期无关。真正让我失望的是堆值,这是明显的巨大尺寸的来源。
我不明白为什么会这样?根据this answer,如果我理解正确,gBigArray 将被放置在数据或 bss 段中 - 但是我猜测每个元素都是一个未初始化的指针,它将被放置在 bss 段中。那么为什么堆值会比所需的值大很多呢?
【问题讨论】:
-
new char- 你没有创建一个新的单字节字符。您正在创建一个 char 对象,该对象需要考虑元数据和其他开销。该数组只是指向这些对象的 200x200x200 指针,但这些对象本身显然占用了 157-30 = 127 MB 的内存。 -
为什么首先要有一个 char 指针数组?为什么不只是一个字符数组?
标签: c++ arrays memory heap-memory