【发布时间】: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<false> 时,函数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