【问题标题】:The effect of auto on compile timeauto 对编译时间的影响
【发布时间】:2013-07-04 16:41:35
【问题描述】:

我们在 C++11 中获得的新 auto 关键字对我来说看起来很模板化,所以我的问题是 - 它会导致与模板相同的编译时间膨胀吗?

关于多态 lambda 的相同问题:

 [](auto val) {…}

这本质上是一个模板 lambda - 这会影响编译时间吗?

【问题讨论】:

  • 不是模板,只是类型推断。
  • 使用auto 作为参数类型甚至都无法编译,不是吗?
  • 一旦 c++14 命中就会出现
  • 请使用c++1y,直到 C++14 真正获得批准。
  • 我有点理解这种情绪,但即使 Herb Sutter 也称它为 c++14 :)

标签: c++ c++14


【解决方案1】:

C++11 的 auto 关键字远没有模板那么重要——它的编译时“开销”与 sizeof 相当,这意味着它接近于零。

与编译器需要在扩展期间执行大量计算的模板不同(C++ 中的模板语言是图灵完备的),auto 关键字要求编译器确定表达式的类型,这是编译器无论如何都知道。事实上,即使没有 auto 关键字,它也必须弄清楚表达式的类型,以决定是否需要应用类型转换。

【讨论】:

  • 多态lambda,如问题所示,实际上会生成template<class _Unnamed> operator()(_Unnamed val)
  • @Xeo 我对多态 lambda 了解不多——我想我需要阅读它们。我希望我可以尝试一下,尽管我的理解是目前还没有公开可用的实现。
  • 参考实现公开:faisalv.github.io/clang-glambda
【解决方案2】:

大多数人所说的“模板膨胀”是一个神话。与处理相同类型的两个单独函数相比,一个模板实例化两次生成的代码。如果您将模板实例化数千次,您将获得大量代码,但如果您编写数千个函数,您将获得相同数量的代码(请参阅Diet Templates 了解一些真正的方式粗心定义模板可能会导致一些“膨胀”。)模板会影响编译时间,但这不是“膨胀”。

auto 关键字不是模板,它使用与模板相同的类型推导规则,但如果您编写auto i = 1;,则只有一个“实例化”,即auto只需推导出一种类型,它会产生与int i = 1;完全相同的代码,因此不会有任何膨胀。这只是声明变量的替代语法。零膨胀。

现在多态 lambda 是不同的,它们使用成员函数模板 operator() 定义了一个类型,因此每次您使用不同的参数类型调用闭包的 operator() 时,您将实例化函数模板的另一个特化,但是具有 与auto 无关,auto 的使用只是声明模板的语法。如果您调用它数千次,您将生成大量代码,但不会超过为您使用的特定类型使用数千种不同的 lambda 表达式(几乎可以肯定,使用通用 lambda 获得的代码更少,因为只有一个闭包键入如此少的 RTTI 和类型名称,以便编译器创建并存储在内存中。)

【讨论】:

  • “模板实例化两次不会产生比处理相同类型的两个单独函数更多的代码。”实际上,我认为这正是被引用的模板膨胀。在 C 中,通常强制转换为集合类型,然后只有一个主体。模板必须每种类型都有一个主体,即使类型非常相似(甚至相同)
  • 另外对模板编译时间的影响(根据我的理解)围绕着所有模板必须在头文件中实现的事实,导致头文件又大又复杂和众多,这对编译有影响时间。编写一千个手动实例不会有这个问题,因为那时标头只有声明,没有定义。
  • @MooingDuck,那么你是在比较苹果和橙子。如果函数都是inline,那将是一个公平的比较。无论如何,对于模板的每个新实例化, 都会对编译时间产生负面影响,这不仅仅是由于标头中的代码。实例化模板对编译器来说代价高昂。
  • @MooingDuck,哪部分不准确?我什至不明白你的第一条评论,如果一个函数模板的两个实例化产生 2N 个字节的代码,而两个函数每个产生 N 个字节,那么膨胀在哪里? C 可以做的任何事情 C++ 也可以做,请参阅饮食模板幻灯片以讨论如何结合这两种方法。您是说“膨胀”仅指编译时间吗?因为这不是大多数人说“模板膨胀”时的意思
  • 无论如何,基本上你是在跟我争论三年前我在那些幻灯片中提出的相同观点......我坚持我的回答,大多数人所说的“模板膨胀”并没有不存在,但请参阅幻灯片了解导致臃肿的一些真正原因。有什么不准确的地方?
猜你喜欢
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多