大多数效率增益来自使用可变参数模板而不是递归遍历,并且在许多情况下,使用可变参数模板的方法是扩展通过索引技巧或其他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)划分和征服.
解决方法
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(例如在库模板代码中),那么编译器将能够重用该调用,因为模板元编程纯粹是功能性的.