c – std :: make_integer_sequence究竟是如何实现的?

前端之家收集整理的这篇文章主要介绍了c – std :: make_integer_sequence究竟是如何实现的?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在观看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)划分和征服.

解决方法

目前,主要的编译器标准库都没有提供N3658编译时整数序列的子O(n)(对数或其他)实现.

libstdc++(gcc):

标准O(n)实现遍历typedef链.这相当于连接到递归调用返回的列表末尾的FP函数.

libc++(clang):

O(n)实现,但有一个有趣的8x展开循环.

MSVC(VS14 CTP1):

O(n),使用在整数常量和整数序列上模板化的递归继承,后者用作累加器(在FP意义上). (请注意,VS14实现实际上位于type_traits标头中,而不是实用程序中.)

ICC是not currently documented,提供编译时整数常量支持.

担心std :: integer_sequence的效率可能在这一点上不值得;编译时整数序列适合的任何问题都会在编译器的大O性能影响编译时间之前很快就会遇到编译器的限制(就函数和模板参数的数量等而言).还要考虑如果在编译中的任何其他地方使用std :: make_integer_sequence(例如在库模板代码中),那么编译器将能够重用该调用,因为模板元编程纯粹是功能性的.

猜你在找的C&C++相关文章