我知道 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
的分支吗? ?它会直接分支到唯一有效的情况吗?
最佳答案
优化器会删除分支和未使用分支中的代码,但要注意:编译器需要在优化器有机会查看代码之前处理该函数,这意味着所有分支都必须有效(可编译) 对于 N
的所有值。
例如,如果第二个分支包含:
} else if (N <= 42) {
char data[50 - N];
// other code
编译器将无法为 N >= 50
实例化模板,即使该分支将被优化器删除也是如此。
关于c++ - 编译时已知条件的标准 if/else?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17555475/