问题描述
我一直告诉编译器足够聪明,消除死code。大部分的code,我写的有很多在编译时已知的信息,但code在最普通的形式被写入。我不知道任何程序集,所以我不能检查生成的汇编。什么样的code,可以在最终的可执行文件被有效消除?
I have always been told that compiler is sufficient smart to eliminate dead code. Much of the code that I am writing has a lot of information known at compile time but the code has to be written in most generic form. I don't know any assembly so I cannot examine the generated assembly. What kind of code that can be effectively eliminated in the final executable?
很少的例子,但不限于
f(bool b){
if(b){
//some code
}else{
//some code
}
}
f(true);
//////////////////////////
template<bool b>
f(){
if(b){
//some code
}else{
//some code
}
}
f<true>();
///////////////////////////
如果的定义˚F
是其他客观code和被叫 F(真)
在主。将有效链接时优化消除了死code?什么是编码风格/编译器选项/伎俩,以方便死亡code消除?
What if definition of f
is in other objective code and the the called f(true)
is in main. Will link time optimisation effectively eliminate the dead code? What is the coding style/compiler option/trick to facilitate dead code elimination?
推荐答案
通常,如果你使用的已开启:
Typically, if you're compiling with the -O
flag on the following flags are turned on:
-fauto-inc-dec
-fcompare-elim
-fcprop-registers
-fdce
[...]
-fdce
表示死者code消除。我建议您编译的二进制文件和无(即通过明确关闭)这个选项,以确保您的二进制文件优化的,只要你愿意的那样。
-fdce
stands for Dead Code Elimination. I'd suggest you compile your binaries with and without (i.e. by turning off explicitly) this option to make sure if your binaries are as optimized as you'd like them to be.
阅读有关的编译:
- SSA积极死code消除。由`开启-fssa-DCE
选项。该过程执行消除code的认为是不必要的
因为其对程序没有外部可见的效果。它
工作在线性时间。
对于帮助与死者code消除连接器通过。两个主要的外卖是:
As for helping the linker with dead code elimination go through this presentation. Two major takeaways being:
与-ffunction截面-fdata区段编译的模块 - 存在
没有缺点呢!
- 这包括静态库,而不仅仅是
二进制文件 - 有可能使你的库的用户从中受益
更高效的死code删除。 - 将您的二进制文件
--gc截面,除非你有反对它使用魔法节讨厌的第三方静态库链接。
您可能还需要看一看(看看有什么机会优化功能可能会错过,为什么)。
You may also want to take a look at this GCC bug (to see what chances of optimization may be missed and why).
这篇关于什么样的死code可以gcc被最终输出消除?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!