我动态分配内存如下:
char* heap_start1 = (char*) malloc(1);
char* heap_start2 = (char*) malloc(1);
当我如下执行 printf 时,令人惊讶的是地址不是连续的。
printf("%p, %p \n",heap_start1,heap_start2);
Result:
0x8246008, 0x8246018
正如您所看到的,有 15 字节的额外内存未进行碎片整理。这绝对不是因为单词对齐。这种特殊排列背后有什么想法吗?
提前致谢!
如果这很重要的话,我在Linux中使用gcc。
glibc's malloc
,对于小于 16 字节的小内存分配,只需将内存分配为 16 字节。这是为了防止释放该内存时出现外部碎片,其中空闲内存块太小而无法在一般情况下用于满足新的要求malloc
运营。
分配的块malloc
还必须足够大,以便在存储空闲块的数据结构中存储跟踪它所需的数据。
这种行为在增加内部碎片的同时,也减少了整个系统的整体碎片。
Source:
http://repo.or.cz/w/glibc.git/blob/HEAD:/malloc/malloc.c http://repo.or.cz/w/glibc.git/blob/HEAD:/malloc/malloc.c(特别阅读第108行)
/*
...
Minimum allocated size: 4-byte ptrs: 16 bytes (including 4 overhead)
...
*/
此外,返回的所有地址malloc
glibc 中的调用与以下内容对齐:2 * sizeof(size_t)
字节。对于 32 位系统(例如您的系统)来说是 64 位,对于 64 位系统来说是 128 位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)