为什么在分配单个字节时地址不连续?

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.

Ran*_*Dev 6

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位.