【发布时间】:2019-01-01 01:23:04
【问题描述】:
为什么会有这样的代码:
#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
为什么编译器初始化一个堆栈帧只是为了以后销毁它,而没有使用它?这肯定不会在主函数外部造成任何错误,因为我从不使用堆栈,所以我不会导致任何错误。为什么会这样编译?
【问题讨论】:
-
编译器设置的优化级别是什么?
-
很可能是因为您编译时没有优化,请尝试使用
-O4标志(假设您使用 gcc 或 clang) -
如何编译最优化?
-
@Riolku 取决于您的编译器。使用 gcc 和 clang,
-O3应该可以解决问题。
标签: c assembly compiler-construction compiler-optimization