我正在观看C ++ 11/14元编程讲座,其中描述了常用算法和tmp模式的一些有效替代方案。
大多数效率提升来自使用可变参数模板而不是递归遍历,并且在许多情况下,使用可变参数模板的方法是扩展通过索引技巧或其他std::integer_sequence
瞬时技巧生成的可变参数包。登记/>
由于效率来自于实例化std::integer_sequence
,特别是别名std::make_integer_sequence
不是一项昂贵的任务,我想确保C ++当前最先进的实现1y标准库的效率足以使make_integer_sequence
瞬时不是一项复杂且耗时耗力的任务
在C ++ 1y-ready编译器中实际实现std::make_integer_sequence
的确切程度如何?
请注意,我并没有问how to implement it efficiently,而是编译器供应商实际上决定如何实现它。
我唯一知道的make_sequence
实现是简单的O(n)递归方法和聪明的O(logN)划分并征服一个。
答案 0 :(得分:12)
目前,主要的编译器标准库都没有提供N3658编译时整数序列的子O(n)(对数或其他)实现。
标准O(n)实现走typedef
s链。这相当于一个FP函数连接到递归调用返回的列表的末尾。
O(n)实现,但有一个有趣的8x展开循环。
O(n),使用在整数常量和整数序列上模板化的递归继承,后者用作累加器(在FP意义上)。 (请注意,VS14实现实际上位于type_traits
标题中,而不是utility
中。)
ICC为not currently documented,提供编译时整数常量支持。
担心std::integer_sequence
的效率在这一点上可能不值得;编译时整数序列适合的任何问题都会在编译器的大O性能影响编译时间之前很快就会遇到编译器的限制(就函数和模板参数的数量等而言)。还要考虑如果在编译中的任何其他地方使用std::make_integer_sequence
(例如在库模板代码中),那么编译器将能够重用该调用,因为模板元编程纯粹是功能性的。