我一直被告知,编译器足够智能,可以消除死代码。我编写的许多代码在编译时都包含大量已知信息,但代码必须以... 的形式编写。
我一直被告知编译器足够智能,可以消除死代码。我编写的大部分代码在编译时都有很多已知信息,但代码必须以最通用的形式编写。我不懂任何汇编语言,所以我无法检查生成的汇编语言。什么样的代码可以在最终的可执行文件中有效地消除?
举几个例子,但不限于
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
在其他目标代码中,而 被调用的 f(true)
在主代码中,会怎么样?链接时间优化能否有效消除死代码?有什么编码风格/编译器选项/技巧可以促进死代码的消除?
当我在这样的 if 表达式中使用模板参数常量时,dce(死代码消除)编译器(Linux 上的 GCC 4.8.1)标志没有帮助,O2、O3 优化也没有帮助。我不得不使用模板特化包装器:
template<bool b>
f();
template<>
f<true>(){
//some code on true condition
}
template<>
f<false>(){
//some code on false condition
}
也可以使用宏来避免编译未使用的代码分支,但这取决于编译器(它是在代码中还是在预编译阶段处理宏):
template<bool b>
f(){
#if b
//some code
#elif
//some code
#endif // b
}