gpt4 book ai didi

optimization - gcc 疯狂优化级别(-O3)还不够疯狂吗?

转载 作者:行者123 更新时间:2023-12-02 03:01:49 26 4
gpt4 key购买 nike

作为回答另一个问题的一部分,我想表明 gcc (-O3) 的疯狂优化级别基本上会删除所有不存在的变量主要用在.代码是:

#include <stdio.h>
int main (void) {
char bing[71];
int x = 7;
bing[0] = 11;
return 0;
}

gcc -O3 输出为:

    .file "qq.c"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
xorl %eax, %eax
movl %esp, %ebp
popl %ebp
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits

现在我可以看到它已经删除了局部变量,但其中仍然存在相当多的浪费。在我看来,整个:

    pushl %ebp
xorl %eax, %eax
movl %esp, %ebp
popl %ebp
ret

部分可以替换为更简单的:

    xorl %eax, %eax
ret

有人知道为什么gcc不执行此优化吗?我知道这对于 main 本身来说节省的很少,但是,如果这也用普通函数完成,那么在大规模循环中不必要地调整堆栈指针的影响将是相当大的。

用于生成程序集的命令是:

gcc -O3 -std=c99 -S qq.c

最佳答案

您可以使用 -fomit-frame-pointer 编译器标志启用该特定优化。这样做会使某些机器上的调试变得不可能,而在其他机器上则变得更加困难,这就是它通常被禁用的原因。

尽管您的 GCC 文档可能会说在各种优化级别启用了 -fomit-frame-pointer,但您可能会发现情况并非如此 - 您几乎肯定必须显式启用自己做吧。

关于optimization - gcc 疯狂优化级别(-O3)还不够疯狂吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5086230/

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