为什么clang 优化级别为-O0时,rsp会减0x10?
mac默认的clang 优化级别是-O0,默认情况下的编译结果中,当调用函数时rsp这个栈寄存器都会减0x10. 这会导致栈浪费了16个字节
这么傻瓜的编译结果让我非常纳闷,其背后是不是有什么个中奥秘?
源码:
#include <stdio.h>
int bar(int c, int d) {
int i = c + d ;
return i;
}
int main(void) {
return bar(2, 3);
}
编译结果为:
> clang -O0 -g c.c -o c.out ;
> otool -tV c.out
_bar:
0000000100000f50 pushq %rbp
0000000100000f51 movq %rsp, %rbp
0000000100000f54 movl %edi, -0x4(%rbp)
0000000100000f57 movl %esi, -0x8(%rbp)
0000000100000f5a movl -0x4(%rbp), %esi
0000000100000f5d addl -0x8(%rbp), %esi
0000000100000f60 movl %esi, -0xc(%rbp)
0000000100000f63 movl -0xc(%rbp), %eax
0000000100000f66 popq %rbp
0000000100000f67 ret
0000000100000f68 nopl (%rax,%rax)
_main:
0000000100000f70 pushq %rbp
0000000100000f71 movq %rsp, %rbp
0000000100000f74 subq $0x10, %rsp
0000000100000f78 movl $0x2, %edi
0000000100000f7d movl $0x3, %esi
0000000100000f82 movl $0x0, -0x4(%rbp)
0000000100000f89 callq _bar
0000000100000f8e addq $0x10, %rsp
0000000100000f92 popq %rbp
0000000100000f93 ret
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是留给局部变量的空间啊。
不管你怎么声明,
main
总是有两个参数:int argc
和char *argv[]
,这0x10
也就是16
个字节就是留给这两个变量的。如果你开了优化,编译器会发现这两个变量根本就没用,所以就不用给它们留地方了。