c++ - 模板特化与编译器优化

标签 c++ templates

我有一个带有 bool 模板参数的类。

template<bool b>
class Foo {
  void doFoo();
};

我希望 doFoo 根据 b 的值做不同的事情。

天真地我会写

选项 1

template<bool b> void Foo<b>::doFoo() {
  if (b) cout << "hello";
  else cout << "goodbye";
}

这对我来说似乎效率低下,因为每次调用函数时我都必须执行一个 if 事件,尽管在编译时应该知道正确的分支。我可以通过模板特化来解决这个问题:

选项 2

template<> void Foo<true>::doFoo() { cout << "hello"; }
template<> void Foo<false>::doFoo() { cout << "goodbye"; }

这样我就不会在运行时执行任何条件。这个解决方案有点复杂(特别是因为在我的真实代码中,这个类有几个模板参数,你不能部分专门化函数,所以我需要将函数包装在一个类中)。

我的问题是,编译器是否足够聪明,知道不执行选项 1 中的条件,因为它总是以相同的方式执行,还是我需要编写特化?如果编译器足够聪明,我会很高兴知道这是依赖于编译器还是我可以依赖的语言特性?

最佳答案

编译器可能会优化分支,因为它在编译时知道 b 是什么。但这并不能保证,唯一确定的方法是检查组件。

如果你可以使用 C++17,你可以使用 if constexpr并且保证只有一个分支存在。

关于c++ - 模板特化与编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50449844/

相关文章:

c++ - 为什么 gdb 不能显示调试信息?

c++ - 将整数标识符转换为指针

c++ - 单链表的地址是否总是有序的

c++ - 如何让派生类定义数据结构

python - 从模板调用 Django View

c++ - 如何在不导致段错误的情况下测试 "dynamic_cast"的结果

c++ - std::conjunction 中的短路是如何工作的

c++ - 仅在 C++ 中声明默认构造函数

c++ - clang++ - 将模板类名视为类范围内的模板

c++ - 如何创建仅包含主文件和模板 header 的 makefile (C++)