我正在尝试解释在Linux中我的应用程序所占用的内存。我进行了一项基本测试,发现如果我们使用new命令申请内存,则至少为单个new分配了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个字节去哪了?被重复使用还是分裂成开销?