为什么clang 优化级别为-O0时,rsp会减0x10?

发布于 2022-08-29 20:48:26 字数 1196 浏览 19 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

葬花如无物 2022-09-05 20:48:26

这是留给局部变量的空间啊。
不管你怎么声明,main总是有两个参数:int argcchar *argv[],这0x10也就是16个字节就是留给这两个变量的。
如果你开了优化,编译器会发现这两个变量根本就没用,所以就不用给它们留地方了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文