gpt4 book ai didi

c - 为什么main在没有变量的情况下初始化堆栈帧

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:45 25 4
gpt4 key购买 nike

为什么这段代码:

#include "stdio.h"
int main(void) {
puts("Hello, World!");
}

决定初始化一个栈帧?这是汇编代码:

.LC0:
.string "Hello, World!"
main:
push rbp
mov rbp, rsp
mov edi, OFFSET FLAT:.LC0
call puts
mov eax, 0
pop rbp
ret

为什么编译器初始化堆栈帧只是为了稍后销毁它,而不是使用它?这肯定不会在主函数外部引起任何错误,因为我从不使用堆栈,所以我不会引起任何错误。为什么要这样编译?

最佳答案

在每个编译函数中都有这些步骤是编译器的“基线”,未优化。它在拆卸时看起来很干净,并且有道理。但是,编译器可以优化输出以减少没有实际效果的代码的开销。您可以通过使用不同的优化级别进行编译来看到这一点。

你得到的是this :

.LC0:
.string "Hello, World!"
main:
push rbp
mov rbp, rsp
mov edi, OFFSET FLAT:.LC0
call puts
mov eax, 0
pop rbp
ret

这是在没有优化的情况下在 GCC 中编译的。

添加标志 -O4 得到 this输出:

.LC0:
.string "Hello, World!"
main:
sub rsp, 8
mov edi, OFFSET FLAT:.LC0
call puts
xor eax, eax
add rsp, 8
ret

您会注意到这仍然会移动堆栈指针,但它会跳过更改基指针,并避免与之相关的耗时内存访问。

假定堆栈在 16 字节边界上对齐。返回地址已被压入后,还需要减去另外 8 个字节以到达函数调用之前的边界。

关于c - 为什么main在没有变量的情况下初始化堆栈帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51498309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com