2

我想问一下 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_two并且Buffer_one彼此相邻分配,为什么内存地址Buffer_twoBuffer_one内存地址分开分配 16 个字节。

4

1 回答 1

6

这是依赖于编译器的行为。由于这些是堆栈分配的缓冲区(实际上与内存分配无关),因此堆栈局部变量在堆栈中的布局方式取决于编译器。你可以玩这个,但我猜出于某种原因,所有数组都以 16 字节的增量分配在堆栈上。

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

于 2012-06-18T15:05:29.170 回答