我想问一下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_two
和Buffer_one
内存地址分配16个字节。
答案 0 :(得分:6)
这是依赖于编译器的行为。由于这些是堆栈分配的缓冲区(实际上与内存分配无关),因此编译器如何在堆栈中布局堆栈局部变量。您可以使用它,但我猜想所有数组都以16字节为增量分配在堆栈上,原因如下。
如果查看反汇编,可以看到变量设置在堆栈框架中的哪个位置。我预感到char[2]
和char[15]
最终都会在堆栈帧中占用16个字节。为什么,我不确定。但我可以补充的是,x64 ABI指定堆栈始终是16字节对齐的,这种类型的分配将使保证这一点变得容易。