标准if/else在编译时已知的条件?

Vin*_*ent 3 c++ optimization templates if-statement c++11

我知道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
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器会做什么(假设-O3)?编译器知道f<0>()将始终在第一种情况下f<32>()分支,将始终在第二种情况下f<64>()分支,并且将始终在第三种情况下分支.

编译器会删除永远存在的分支false吗?它会直接分支到唯一有效的案例吗?

Dav*_*eas 6

优化器将删除未使用分支中的分支和代码,但要注意:编译器需要在优化器甚至有机会查看代码之前处理该函数,这意味着所有分支必须对所有分支都有效(可编译)价值观N.

例如,如果第二个分支包含:

} else if (N <= 42) {
   char data[50 - N];
// other code
Run Code Online (Sandbox Code Playgroud)

N >= 50即使优化程序将删除分支,编译器也无法实例化模板.