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

MaP*_*aPo 1 c++ templates if-statement

我有以下功能

template <bool c>
void func()
{
    ...
    if (c) {
        // do something
    } else {
        // do something else
    }
}
Run Code Online (Sandbox Code Playgroud)

该函数将在循环内多次使用:

for (...) {
    func<true>();
}
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ica 5

编译器可能会也可能不会优化您的代码,因为它知道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
    }
}
Run Code Online (Sandbox Code Playgroud)