2013-07-07 31 views
12

新的汽车关键词看起来相当templat'ish我,所以我的问题是 - 将它发生同样的编译时间膨胀为模板吗?自动对编译的时候,我们得到了在C++ 11的影响

在关于多态的lambda同样的问题:

[](auto val) {...} 

这基本上是一个模板拉姆达 - 将这种影响编译时间或没有?

+6

它不是模板,它只是键入推理。 –

+0

使用'auto'作为参数类型甚至不编译,是吗? – Jason

+2

它会一次C++ 14命中 – Zeks

回答

17

的C++ 11的auto关键字超过模板重量级远不 - 它的编译时间“开销”是媲美的sizeof,这意味着它是接近于零。

与扩展期间编译器需要执行大量计算的模板(C++中的模板语言为Turing-complete)不同,auto关键字要求编译器计算出表达式的类型,这是无论如何编译器知道。事实上,即使没有关键字auto,它也必须找出表达式的类型来决定是否需要应用类型转换。

+11

如问题所示,多态lambda会实际生成'template operator()(_ Unnamed val)'。 – Xeo

+0

@Xeo对多态lambda表达式我不太了解 - 我想我需要阅读它们。我希望我可以尝试一下,但我的理解是,还没有公开的实现。 – dasblinkenlight

+1

参考实现是可公开获得的:“实例化两次模板不产生更多的代码比处理这些相同类型的两个单独的函数” http://faisalv.github.io/clang-glambda/ –

12

大多数人的“模板膨胀”的意思是一个神话。实例化两次的模板产生的代码多于处理这些相同类型的两个单独的函数的代码no。如果你实例化模板几千倍,你会得到大量的代码,但如果你写成千上万的功能,你会得到的代码(见Diet Templates对于一些真正的方法不慎定义模板可以导致一些等量“膨胀”)。模板可以影响编译时间,但这不是“膨胀”。

auto关键字模板,它使用类型推演为模板,同样的规则,但如果你写auto i = 1;只有一个“实例”,即auto只有演绎一类,它产生完全相同的代码作为int i = 1;所以不能有任何臃肿。这是声明变量的另一种语法。零膨胀。

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

+0

其实,我认为这就是所提到的模板膨胀。在C中,强制转换为集合类型是很常见的,然后只有一个主体。 _must_有一个身体每个类型,即使类型非常相似(甚至相同)的模板 –

+0

同样在模板的影响(根据我的理解)编译的时候围绕着一个事实,即所有模板必须在头文件来实现,从而导致头大而复杂,数量众多,对编译时间有影响。编写一千个手动实例化不会有这个问题,因为那么头文件只有声明而不是定义。 –

+1

@MooingDuck,那你就是比较苹果和橘子。如果这些函数都是“内联”的,那将是一个公平的比较。无论如何,这对模板的每个新实例化都会产生负面影响,这不仅仅归因于头文件中的代码。实例化模板对于编译器来说是昂贵的。 –