gpt4 book ai didi

c - 为什么 GCC 在不需要时生成堆栈保存指令?

转载 作者:太空狗 更新时间:2023-10-29 14:51:17 24 4
gpt4 key购买 nike

我正在编译以下简单的演示函数:

int add(int a, int b) {
return a + b;
}

当然,这个函数会被内联,但我们假设它是动态链接的,或者由于其他原因没有被内联。禁用优化后,编译器会生成预期的代码:

00000000 <add>:
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 8b 45 0c mov eax,DWORD PTR [ebp+0xc]
6: 03 45 08 add eax,DWORD PTR [ebp+0x8]
9: 5d pop ebp
a: c3 ret

由于这个函数内部没有函数调用,所以0、1、9处的指令貌似没什么用。由于优化被禁用,这是可以接受的。

但是,在使用 -Os -s 优化大小进行编译时,会生成完全相同的代码。使用这些选项将函数的大小增加 66% 似乎相当浪费。

为什么代码没有针对以下内容进行优化?

00000000 <add>:
0: 8b 45 0c mov eax,DWORD PTR [esp+0x8]
3: 03 45 08 add eax,DWORD PTR [esp+0x4]
6: c3 ret

编译器是认为这不值得优化,还是与函数对齐等其他细节有关?

最佳答案

这样做是为了保留调试器单步执行代码的能力。

如果你真的想禁用这个尝试-fomit-frame-pointer

使用 -Os -fomit-frame-pointer -S -masm=intel 编译上面的代码给出了这个:

    .file   "frame.c"
.intel_syntax noprefix
.text
.globl _add
.def _add; .scl 2; .type 32; .endef
_add:
mov eax, DWORD PTR [esp+8]
add eax, DWORD PTR [esp+4]
ret
.ident "GCC: (rev0, Built by MinGW-builds project) 4.8.0"

关于c - 为什么 GCC 在不需要时生成堆栈保存指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17435446/

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