c++ - 编译时已知条件的标准 if/else?

标签 c++ templates optimization 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
    }
}

编译器会做什么(假设 -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/

相关文章:

c++ - 如何使用 vector 字符串标记构建表达式树?

c++ - 监控事件目录事件

c++ - QT如何将Qlist传递给类构造函数

c++ - 函数模板

mysql - 这个查询看起来优化了吗?

c++ - 将 "enum: int64_t"值写入 std::ostringstream 会将其截断为 int

c++ - C++ : "expected primary-expression before ‘>’ token"中的两个模板

c++ - 如何专门化从特定类型派生的类型的模板

c++ - 现代 C++ 编译器会在类型转换后优化赋值吗?

performance - 循环优化