编译器如何优化模板?

maximum_prime_is_463035818

这样写代码有意义吗?

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);}
马修·桑德斯(Matthew Sanders)

这里要记住的是,模板不同于诸如C#之类的泛型之类的语言功能。

将模板视为类型识别的高级预处理器是相当安全的简化方法。这是模板元编程(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被发现是一次不幸的事故,并且几乎是STLBoost的基础

它已经完成,因此您可以在编译时进行各种计算。

它是惰性计算的,因此您可以通过在不想使用的模板的特殊化中放置无效逻辑来实现自己的编译时声明。例如,如果我要注释掉foo<false>专业化并试图像foo<false>(1.0);编译器会抱怨的那样使用它,尽管它会非常满意foo<true>(1.0);

是另一个Stack Overflow帖子,演示了这一点。

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

  1. 现代C ++设计
  2. C ++模板元编程:Boost and Beyond的概念,工具和技术
  3. 有效的C ++

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

GraalVM:如何实现编译器优化?

来自分类Dev

如何有条件地设置模板头的编译器优化

来自分类Dev

C ++编译器优化放弃模板专业化

来自分类Dev

模板布尔会被编译器优化吗?

来自分类Dev

C / C ++优化编译器由于使用模板而损坏

来自分类Dev

编译器优化问题

来自分类Dev

编译器的优化指标

来自分类Dev

编译器如何编译模板和类型检查?(C ++)

来自分类Dev

如何禁用V8的优化编译器

来自分类Dev

我如何“告诉” C编译器不应优化代码?

来自分类Dev

我如何看待编译器进行的优化

来自分类Dev

Linux上的Swift:如何指定编译器优化

来自分类Dev

编译器优化如何影响缓存不友好的算法?

来自分类Dev

C ++编译器是否基于模板参数优化模板方法?

来自分类Dev

是否对不使用模板参数的模板化类的方法进行了编译器优化?

来自分类Dev

编译器如何从map中找出模板类型

来自分类Dev

在C ++中,编译器如何处理对模板的调用?

来自分类Dev

编译器如何确定要调用的函数模板?

来自分类Dev

如何帮助编译器推断模板参数?

来自分类Dev

如何使编译器了解模板化结构?

来自分类Dev

是否保证编译器可以优化模板生成的递归代码?

来自分类Dev

nvcc编译器未优化

来自分类Dev

编译器是否优化String文字?

来自分类Dev

编译器优化回调与JMP

来自分类Dev

了解MSVS C ++编译器优化

来自分类Dev

C#编译器优化

来自分类Dev

禁用GLSL编译器优化

来自分类Dev

R中的字节编译器优化

来自分类Dev

编译器优化或我的误解