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

标签 c++ template-meta-programming c++14

我正在观看 C++11/14 元编程演讲,其中描述了常见算法和 tmp 模式的一些有效替代方案。

大部分效率提升来自使用可变参数模板而不是递归遍历,在许多情况下,使用可变参数模板的方法是扩展通过索引技巧或其他 std::integer_sequence实例化技巧。
由于这种效率来自实例化 std::integer_sequence 的事实,特别是别名 std::make_integer_sequence 不是一项昂贵的任务,我想确保当前最先进的 C++1y 标准库实现效率足以使 make_integer_sequence 实例化不是一项复杂且耗时/内存的任务。
std::make_integer_sequence 在 C++1y-ready 编译器中究竟是如何实现的?

请注意,我不是在问 how to implement it efficiently ,但编译器供应商实际上是如何决定实现它的。

我所知道的 make_sequence 的唯一实现是简单的 O(n) 递归方法和巧妙的 O(logN) 分治法。

最佳答案

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

libstdc++ (海合会):

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

libc++ ( clang ):

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

MSVC ( VS14 CTP1 ):

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

ICC 是 not currently documented作为提供编译时整数常量支持。


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

关于c++ - std::make_integer_sequence 究竟是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25372805/

相关文章:

c++ - fatal error LNK1104 : cannot open file 'opencv_calib3d220d.obj'

c++ - boost MPL : Call a (member) function only if it exists

c++ - 成员函数上的 boost::enable_if,重载返回类型

C++数组作为模板参数

c++ - 将多个 for 循环组合成单个迭代器

c++ - 无法在动态链接库中找到过程入口点 _ZNSt7_cxx1112basic_stringlcSt11char_traitslcESalcEEC1Ev

c# - 如何以编程方式读取 .pdf 文件并将其转换为音频(.mp3 格式)?

c++ - alignas(64) 速度较慢/导致悲观

c++ - 为什么 Qt Creator 在包含的路径中找不到包含的 header - 即使 qmake 能够找到它们

c++ - 当元组给出参数时如何检查方法是否存在?