64位机器中的内存分配

时间:2012-06-18 15:02:44

标签: c gcc 64-bit 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);
}

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

$ ./sizeofchar 
Size of char: 1
Buffer_two is at 0x7fff98069910
Buffer_one is at 0x7fff98069900

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

1 个答案:

答案 0 :(得分:6)

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

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