我正在将以下代码段编译成程序集
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1,2,3);
}
这是function
function:
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp ; why is 48 being subtracted from the stack pointer?
movl %edi, -36(%rbp)
movl %esi, -40(%rbp)
movl %edx, -44(%rbp)
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
我在64位计算机上运行它,所以我认为三个8字节的单词足以容纳buffer1
和buffer2
。
答案 0 :(得分:-1)
乍一看,这似乎是内存对齐的问题。 This question详细介绍,我会特别留意joshperry的回答:https://stackoverflow.com/a/381368
维基百科也在这里讨论:Data structure alignment
简而言之,char buffer1[5]
将创建两个64字节的字(字符1-4和5+)。如果它没有,那么每次你引用buffer2
时,系统必须至少执行两次操作才能获得buffer2
的正确起点。