我试图解释我在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;
};
Run Code Online (Sandbox Code Playgroud)
当我执行./a.out 8 100它时给出了以下结果.
....
....
....
0xf6db10
0xf6db30
0xf6db50
0xf6db70
0xf6db90
0xf6dbb0
0xf6dbd0
0xf6dbf0
0xf6dc10
0xf6dc30
0xf6dc50
0xf6dc70
Run Code Online (Sandbox Code Playgroud)
我得到的所有内存都有32个字节的间隙.
直到24(BlockSize)它是一样的.如果超过24,则为48字节.
./a.out 25 100
....
....
....
0x18b30c0
0x18b30f0
0x18b3120
0x18b3150
0x18b3180
0x18b31b0
0x18b31e0
0x18b3210
0x18b3240
0x18b3270
0x18b32a0
Run Code Online (Sandbox Code Playgroud)
当我为更大尺寸测试时; 我们发现我们得到的内存增加了16个字节的块,至少保留了8个字节的开销.
我的问题是,
C语言中的内存分配必须为所有原始类型返回适当对齐的内存[0].这意味着内存分配通常会为您提供至少8字节对齐的内存,以便您可以存储doubles它们.
因此,当您请求1字节的内存时,由于对齐要求,您将使用至少8个字节.在64位系统上,内存分配通常会为您提供16字节对齐的内存,因为这些系统通常具有16字节大型(SSE向量)
此外,内存分配器需要一些空间用于其管理数据,例如分配的大小.根据实现,可以在用户分配的内存块之前或之后放置该数据.
[0]当地址/指针是访问它的大小的倍数时,内存是对齐的,某些cpus不支持未对齐访问(例如sparc),其他(如x86)如果这样做会有性能损失.
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |