#include int main(void) { int i; scanf("%d", &i); if(i != 30) { return(0); } printf("i is equal to %dn", i); }
结果字符串似乎总是“我等于30”,那么,为什么GCC不会通过调用puts()
或write()
来优化对printf的调用?
(刚刚使用gcc -O3
(版本5.3.1)或Godbolt Compiler Explorer检查生成的程序集)
首先,问题不在于if
; 如你所见, gcc
通过if
看到并设法直接传递给printf
。
现在, gcc
确实有一些逻辑来处理printf
特殊情况(特别是,它确实优化了printf("somethingn")
甚至printf("%sn", "something")
to puts("something")
),但它非常具体,并没有进一步发展; printf("Hello %sn", "world")
保持原样。 更糟糕的是,上面没有尾随换行符的任何变体都保持不变,即使它们可以转换为fputs("something", stdout)
。
我想这归结为两个主要问题:
对于好奇的读者来说,这是实际实现这种优化的地方; 正如你所看到的,该函数匹配了有限数量的非常简单的情况(除了GIMPLE之外,由于编写了这篇很好的文章而没有改变很多)。 顺便提一下,源实际上解释了为什么他们无法为非换行情况实现fputs
变体(在编译阶段没有简单的方法来引用stdout
全局)。
现代编译器非常聪明,但不够聪明,不能用逻辑来预测输出。 在这种情况下,人类程序员很容易优化这段代码,但这项任务对于机器来说太难了。 事实上,预测程序的输出而不运行它是不可能的程序(例如gcc)。 为了certificate,请参阅暂停问题 。
无论如何,你不希望没有输入的所有程序都被优化为几个puts()
语句,因此GCC不优化包含一个scanf()
语句的代码是完全合理的。
但是,这并不意味着编译器无法或不应该进行优化以生成更优化的执行文件。 虽然不可能预测所有程序的结果,但完全可能并希望改进其中的许多程序 。
不确定这是否是一个令人信服的答案,但我希望编译器不应该优化printf("%dn", 10)
case to puts("10")
。
为什么? 因为这种情况可能比你想象的更复杂。 以下是我目前可以想到的一些问题:
以上就是c/c++开发分享为什么GCC没有优化对printf的这个调用?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549199.html