as3*_*unt 3 c unix malloc alignment
我按如下方式动态分配内存:
char* heap_start1 = (char*) malloc(1);
char* heap_start2 = (char*) malloc(1);
Run Code Online (Sandbox Code Playgroud)
当我按照以下方式做printf时,令人惊讶的是地址不是连续的.
printf("%p, %p \n",heap_start1,heap_start2);
Run Code Online (Sandbox Code Playgroud)
结果:
0x8246008, 0x8246018
Run Code Online (Sandbox Code Playgroud)
如您所见,有一个15字节的额外内存被进行碎片整理.这绝对不是因为词对齐.这种奇特的对齐背后的任何想法?
提前致谢!
如果重要的话,我在linux中使用gcc.
glibc malloc,对于小于16字节的小内存分配,只需将内存分配为16字节.这是为了防止在释放该存储器时的外部碎片,其中空闲存储器块太小而不能在一般情况下用于实现新malloc操作.
分配的块malloc也必须足够大,以存储在存储空闲块的数据结构中跟踪它所需的数据.
这种行为在增加内部碎片的同时,减少了整个系统的整体碎片.
资料来源: http ://repo.or.cz/w/glibc.git/blob/HEAD : /malloc/malloc.c (特别是阅读第108行)
/*
...
Minimum allocated size: 4-byte ptrs: 16 bytes (including 4 overhead)
...
*/
Run Code Online (Sandbox Code Playgroud)
此外,mallocglibc中调用返回的所有地址都与:2 * sizeof(size_t)bytes 对齐.对于32位系统(例如你的系统),这是64位,对于64位系统,这是128位.
| 归档时间: |
|
| 查看次数: |
511 次 |
| 最近记录: |