微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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(例如在库模板代码中),那么编译器将能够重用该调用,因为模板元编程纯粹是功能性的.

原文地址:https://www.jb51.cc/c/116143.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐