【问题标题】:Guaranteed 'if' statement elimination by using templates使用模板保证“if”语句消除
【发布时间】:2020-07-15 16:03:17
【问题描述】:

我想知道是否可以保证(通过编译器的实现)某些“if”语句永远不会在二进制代码中实现,即不会使用某些给定“if”语句的跳转在二进制代码中。

这可以通过示例来激发,但让我简短一些。假设你有这样一个类:

template<bool N = true>
class A {
    public:
        // ...

        void f() {
            // do some work
            if (N) {
                // do some optional work
            }
            // do more work
        }

        // ...
};

当类A 被实例化为A&lt;false&gt; 时,函数f 中的'if' 语句是否会被现代编译器实现? “实现”是指是否要生成分支(或跳转)指令。

在我看来答案是否定的,即编译器会将其删除(可能是因为实现if (false) { .. } 没有多大意义)。但这是否保证会发生在 all 编译器中?我如何知道 a 编译器是否进行了这种优化?仅当优化标志(例如,g++ 中的-O1 或更高级别)传递给编译器时才会删除“if”语句?也就是说,在完全没有优化的情况下,是不是也去掉了?

【问题讨论】:

  • FWIW,if constexpr 保证这一点,因为N 是一个常量表达式,所以它在这里可以工作。
  • "我如何知道编译器是否进行了这种优化?" 如果你真的需要这么关心微观性能一段代码,那么您应该经常观察您选择的编译器的程序集输出。
  • @NathanOliver 这很有趣,我会检查一下。
  • @NicolBolas,当然。如果可以的话,我非常有兴趣在我的代码中摆脱它们,但有时它们是必要的(或者我不知道如何摆脱它们)。我最感兴趣的是编译器在优化 'if' 方面的趋势(当然,只要可以做到)。
  • @Lluís 如果您知道 if 语句永远不会被执行,最好的办法就是将其完全删除,如果您不需要它,请不要使用它,这是最有效的方式......跨度>

标签: c++ if-statement templates compiler-optimization


【解决方案1】:

也许

if constexpr (condition)

语法将是一个有趣的解决方案,没有模板

【讨论】:

  • “没有模板” - if constexpr 提供的关于丢弃语句的保证在模板中。
猜你喜欢
  • 2018-12-06
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多