C++bool模板参数和编译时if



我有以下函数

template <bool c>
void func()
{
...
if (c) {
// do something
} else {
// do something else
}
}

此功能将在循环中使用多次:

for (...) {
func<true>();
}

我想知道内部函数是否在编译时、运行时完成,或者是否留给编译器。

编译器可能会也可能不会优化您的代码,因为它在编译时知道c是什么。真正知道的唯一方法是查看生成的程序集代码,看看分支是否已删除。也就是说,C++17引入了constexpr-if,它保证在编译时评估条件并丢弃未执行的分支。这会让你的功能看起来像

template <bool c>
void func()
{
// ...
if constexpr(c) {
// do something if c is true, discarded otherwise
} else {
// do something if c is false, discarded otherwise
}
}

最新更新