代码之家  ›  专栏  ›  技术社区  ›  MaPo

C++bool模板参数和编译时如果

  •  0
  • MaPo  · 技术社区  · 5 年前

    我有以下功能

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

    此函数将在循环中多次使用:

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

    我想知道func内部是在编译时、运行时完成的,还是留给编译器处理的。

    1 回复  |  直到 5 年前
        1
  •  5
  •   cigien Jorge Eldis    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
        }
    }