我想问一下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我的问题是,即使字符类型的大小是1字节,并且我假设(如果我错了,请纠正我) Buffer_two和Buffer_one被分配在彼此旁边,为什么Buffer_two和Buffer_one内存地址被分配为16字节。
发布于 2012-06-18 23:05:29
这是依赖于编译器的行为。由于这些是堆栈分配的缓冲区(实际上与内存分配无关),因此堆栈局部变量在堆栈中的布局取决于编译器。您可以尝试这样做,但我猜测,出于某种原因,所有数组都是以16字节为增量在堆栈上分配的。
如果你看一下反汇编,你可以看到变量在堆栈帧中被设置的位置。我有预感,char[2]和char[15]最终都会占用堆栈帧中的16个字节。为什么,我不是很确定。但我可以补充的是,x64 ABI指定堆栈始终是16字节对齐的,这种类型的分配将很容易保证这一点。
https://stackoverflow.com/questions/11085581
复制相似问题