我最近知道一个整数从内存中占用 4 个字节。
首先运行这段代码,并测量内存使用情况:
int main()
{
int *pointer;
}
- 占用了 144KB。
然后我修改代码分配1000个整数变量。
int main()
{
int *pointer;
for (int n=0; n < 1000; n++)
{
pointer = new int ;
}
}
- 然后花了 (168-144=) 24KB
但假设 1000 个整数占用 (4bytes x 1000=) 3.9KB。
然后我决定制作 262,144 个整数变量,它们应该消耗 1MB 内存。
int main()
{
int *pointer;
for (int n=0; n < 262144; n++)
{
pointer = new int ;
}
}
令人惊讶的是,现在需要 8MB
内存使用量随着整数的数量呈指数增长。
为什么会这样?
我使用的是 Kubuntu 13.04 (amd64)
请给我一点解释。
谢谢!
注意:sizeof(integer)
返回 4
最佳答案
单独分配的动态对象的内存不需要是连续的。事实上,由于 new char[N]
的对齐要求(即在 alignof(std::maxalign_t)
对齐,通常为 16),标准内存分配器可能永远不会费心返回任何内容但 16 字节对齐的内存。所以每个int
分配实际上消耗(至少)16 个字节。 (分配器可能需要更多内存用于内部簿记。)
道德当然是你应该使用std::vector<int>(1000000)
合理处理一百万个动态整数。
关于C++ 为变量分配异常大的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16624438/