c++ - 编译器如何优化模板?

标签 c++ templates

这样写代码有意义吗?

template<bool X>
double foo(double x){
     return (X) ? moo(x) : bar(x);
}

我知道有更好的方法来实现这个示例,但我想知道,假设编译器将识别死代码并将其实例化为通常是否安全

double foo<true>(double x){return moo(x);}
double foo<false>(double x){return bar(x);}

最佳答案

这里要记住的是,模板与 C# 等语言中的泛型等语言功能不同。

将模板视为一种类型感知的高级预处理器是一种相当安全的简化。这就是 Template metaprogramming (TMP) 背后的想法这基本上是编译时编程。

就像扩展预处理器模板一样,结果会经历与正常逻辑相同的所有优化阶段。

这是一个以与 TMP 更一致的风格重写逻辑的示例。这使用了函数特化。

template<bool X>
double foo(double x);

template<>
double foo<true>(double x)
{
    return moo(x);
}

template<>
double foo<false>(double x)
{
    return bar(x);
}

TMP被发现实际上是一次愉快的意外,并且几乎是 STL 的面包和黄油。和 Boost

turing complete所以你可以在编译时进行各种计算。

它是惰性评估的,因此您可以通过将无效逻辑放入您不想使用的模板的专门化中来实现您自己的编译时断言。例如,如果我要注释掉 foo<false>特化并尝试像foo<false>(1.0);一样使用它编译器会提示,尽管它会对 foo<true>(1.0); 非常满意。 .

Here另一篇 Stack Overflow 帖子演示了这一点。

如果有兴趣,请进一步阅读:

  1. Modern C++ Design
  2. C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond
  3. Effective C++

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

相关文章:

c++ - 合并排序算法错误

c++ - C++ 中 priority_queue 的奇怪的用户定义比较结构错误

c++ - 如何避免为采用编译时值的运算符编写显式模板参数?

c++ - 调用另一个函数重载

c++ - Barton-Nackman 技巧中使用的 C++ 非模板成员是什么?

c++ - 完全专用模板中构造函数的外线定义

c++ - 如何在不修改uml图c++的情况下实现向对象添加价格

在 h 文件中声明的 c++ 静态数组给出警告 'defined but not used'

c++ - 异常 C++ : Catch by reference/value

c++ - 我什么时候应该使用_aligned_malloc()?