【发布时间】:2013-07-09 18:22:25
【问题描述】:
我知道 C++ 中的一些元编程技术可以在编译时计算常量。大多数情况下,元函数中的分支是通过三元运算符完成的,与标准 if/else 相反,可以在编译时进行评估。
但是关于这种功能:
template <unsigned int N>
void f()
{
if (N == 0) {
// Some computations here
} else if (N <= 42) {
// Some computations here
} else {
// Some computations here
}
}
编译器会做什么(假设-O3)?
编译器知道f<0>() 总是在第一种情况下分支,f<32>() 总是在第二种情况下分支,f<64>() 总是在第三种情况下分支。
编译器会删除始终为 false 的分支吗?它会直接分支到唯一有效的案例吗?
【问题讨论】:
-
是的,现代编译器会删除无用的分支。
-
说...如果你想保证,那么简单地使用 template specialization 并说:
template <...> void f<0>( /* computation for 0 */ }等等。让它绝对、明确、独立于编译器地清楚你想要什么?
标签: c++ templates optimization if-statement c++11