【问题标题】:Templates and optimization of conditional branching条件分支的模板和优化
【发布时间】:2021-06-27 21:29:00
【问题描述】:

我是 C++ 和整个模板编程的新手,很抱歉这个问题可能有点愚蠢或没有多大意义,但我有以下代码

enum SomeEnum : int {FIRST, SECOND, THIRD, FOURTH};

template<SomeEnum Val>
void Foo(){
... some code ...
   int x = 0;
   if(Val == FIRST){
      x = DoCalculationA();
   }
   else if(Val == THIRD){
      x = DoCalculationB();
   }
... some more code that uses 'x', and perhaps some more if checks on Val  ...
}

我可以假设编译器会优化掉 if 语句 - 例如当我将这个函数调用为 Foo&lt;FIRST&gt;() 时,它不会对 Val 进行任何 if 检查?这甚至是使用模板的适当方式,还是我应该将枚举作为参数传递?我的代码需要运行得非常快,所以如果分支问题很大,那么任何额外的代码。

编辑:

只是为了让它更清楚一点。 Foo 是这样调用的

Bar(SomeOtherEnum someOtherEnum){
   switch(someOtherEnum){
      case VALUE_1:
         Foo<FIRST>();
      case VALUE_2:
         Foo<SECOND>();
      case VALUE_3:
         Foo<THIRD>();
      default:
         Foo<FOURTH>();
   }
}

【问题讨论】:

  • 您可以用switch..case 语句替换Valif..elseifstackoverflow.com/q/97987
  • 嘿,那些if 声明死了吗?
  • 不,这个函数将被多次调用,使用所有不同的枚举值。在foo 中还有更多if 分支,具体取决于Val 的值。所以我基本上想要做的是有一些Bar 函数调用适当的Foo 模板,具体取决于Bar 函数中的一些枚举变量。基本上在Bar 中会有一个主switch 语句调用正确的Foo 模板。
  • 使用if constexpr?
  • 所以如果我在模板值上使用if constexpr,我可以安全地假设分支将消失?我想这可能就是我想要的,谢谢!

标签: c++ templates optimization


【解决方案1】:

C++ 标准允许 C++ 编译器执行任何没有明显效果的优化。但是 C++ 编译器没有义务这样做。

在您的具体情况下,所描述的优化似乎没有任何可观察到的效果,这是一个相当简单的优化。因此,您的 C++ 编译器很可能不会生成永远不会使用的代码。但是没有正式要求这样做,因此为了确定是否是这种情况,有必要使用调试器检查编译后的代码。

C++ 编译器是否执行这种优化通常也取决于编译选项。也可以强制编译器的手,强制它避免编译不需要的代码。该方法取决于 C++ 版本。 C++17 最简单的解决方案是if constexpr。与早期 C++ 版本一起使用的替代方案通常涉及一些重构和模板特化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 2015-11-24
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多