使用模板保证 'if' 语句消除
Guaranteed 'if' statement elimination by using templates
我想知道是否可以(通过编译器的实现)保证某些 'if' 语句永远不会以二进制代码实现,即某些给定的 'if' 语句不会跳转将永远用在二进制代码中。
这可以通过示例来激发,但让我简短一点。假设你有这样一个 class:
template<bool N = true>
class A {
public:
// ...
void f() {
// do some work
if (N) {
// do some optional work
}
// do more work
}
// ...
};
当 class A
被实例化为 A<false>
时,函数 f
中的 'if' 语句是否会被现代编译器实现? “实施”是指是否要生成分支(或跳转)指令。
在我看来,答案是否定的,即编译器将删除它(可能是因为实现 if (false) { .. }
没有多大意义)。但这是否保证会在 all 编译器中发生?我怎么知道 a 编译器是否进行了这种优化? 'if' 语句是否仅在优化标志(例如 g++
中的 -O1
或更高)传递给编译器时才会被删除?也就是说,完全没有优化的时候是不是也去掉了?
可能
if constexpr (condition)
语法将是一个有趣的解决方案,没有模板
我想知道是否可以(通过编译器的实现)保证某些 'if' 语句永远不会以二进制代码实现,即某些给定的 'if' 语句不会跳转将永远用在二进制代码中。
这可以通过示例来激发,但让我简短一点。假设你有这样一个 class:
template<bool N = true>
class A {
public:
// ...
void f() {
// do some work
if (N) {
// do some optional work
}
// do more work
}
// ...
};
当 class A
被实例化为 A<false>
时,函数 f
中的 'if' 语句是否会被现代编译器实现? “实施”是指是否要生成分支(或跳转)指令。
在我看来,答案是否定的,即编译器将删除它(可能是因为实现 if (false) { .. }
没有多大意义)。但这是否保证会在 all 编译器中发生?我怎么知道 a 编译器是否进行了这种优化? 'if' 语句是否仅在优化标志(例如 g++
中的 -O1
或更高)传递给编译器时才会被删除?也就是说,完全没有优化的时候是不是也去掉了?
可能
if constexpr (condition)
语法将是一个有趣的解决方案,没有模板