64位机器中的内存分配

Win*_*ins 2 c 64-bit gcc callstack

我想问一下64位ubuntu Linux中的内存分配问题.

我有以下代码

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char buffer_one[8], buffer_two[8];

    printf("Size of char: %u\n", sizeof(char));

    printf("Buffer_two is at %p\n", buffer_two);
    printf("Buffer_one is at %p\n", buffer_one);
}
Run Code Online (Sandbox Code Playgroud)

当它运行时,会显示以下结果

$ ./sizeofchar 
Size of char: 1
Buffer_two is at 0x7fff98069910
Buffer_one is at 0x7fff98069900
Run Code Online (Sandbox Code Playgroud)

我的问题是,即使char类型的大小是1字节,我假设(如果我在这里错了请纠正我)Buffer_two并且Buffer_one彼此相邻分配,为什么Buffer_twoBuffer_one内存地址分配16个字节.

Jon*_*art 6

这是依赖于编译器的行为.由于这些是堆栈分配的缓冲区(实际上与内存分配无关),因此编译器如何在堆栈中布局堆栈局部变量.你可以玩这个,但我猜想所有数组都以16字节为增量分配在堆栈上,原因有这样或那样.

如果查看反汇编,可以看到变量设置在堆栈框架中的哪个位置.我有一个预感,a char[2]char[15]两个最终在堆栈帧中占用16个字节.为什么,我不确定.但我可以补充的是,x64 ABI指定堆栈始终是16字节对齐的,这种类型的分配将使其易于保证.