【发布时间】:2014-07-10 17:49:04
【问题描述】:
我试图解释我在 Linux 中的应用程序占用的内存。我做了一个基本的测试,发现如果我们新建一些内存,它会为单个新内存分配至少 32 个字节。
这是我的代码。
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(int argc, const char** argv)
{
int iBlockSize = atoi(argv[1]);
int iBlockCount = atoi(argv[2]);
for (int i = 0 ; i < iBlockCount ; i++)
{
cout << (int*)(new char[iBlockSize]) << endl;
}
return 0;
};
当我执行./a.out 8 100 时,它给出了以下结果。
....
....
....
0xf6db10
0xf6db30
0xf6db50
0xf6db70
0xf6db90
0xf6dbb0
0xf6dbd0
0xf6dbf0
0xf6dc10
0xf6dc30
0xf6dc50
0xf6dc70
我得到的所有内存都有 32 个字节的间隙。
直到 24 (BlockSize) 它是一样的。如果超过 24 则为 48 字节。
./a.out 25 100
....
....
....
0x18b30c0
0x18b30f0
0x18b3120
0x18b3150
0x18b3180
0x18b31b0
0x18b31e0
0x18b3210
0x18b3240
0x18b3270
0x18b32a0
当我测试更大尺寸时;发现我们获得的内存增加了 16 字节块,保持至少 8 字节开销。
我的问题是,
- 我的测试正确吗?
- 这是 linux 内存管理的正确行为吗?
- 如果我们新的 8 个字节,我们得到 32。其他 24 发生了什么?重复使用或分散开销?
【问题讨论】:
-
每次分配都会有开销。并且分配数组通常需要将大小存储在某个地方,通常存储在数据本身附近。