【发布时间】:2014-10-11 22:15:13
【问题描述】:
我正在观看一个 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 就绪的编译器中究竟是如何实现的?
请注意,我问的不是how to implement it efficiently,而是编译器供应商实际上决定如何实现它。
make_sequence 我知道的唯一实现是简单的 O(n) 递归方法和聪明的 O(logN) 分而治之的方法。
【问题讨论】:
-
@KerrekSB 我认为他指的是生成序列的编译时复杂度?
-
你能提供那个演讲的链接吗?
-
@KerrekSB 我只是在谈论编译器供应商完成的实现(可能是 GCC stdlibc++ 和/或 LLVM stdc++),以及选择该实现的原因。我在想一个真正的标准库实现是否依赖于编译器特定的技巧,或者它是用众所周知的 tmp 方法实现的(就像上面在答案中提到的那样)。我不是在询问对编译器内部的深入了解,如果那是你担心的话。
-
@Manu343726 有演讲视频吗? (抱歉跑题了)
-
@kerrecksb 递归深度和实例化计数都是相当客观的抽象性能度量,如果没有,大 n 的编译时间可能足以衡量(例如,3 万亿
size_t?)先上肚。
标签: c++ template-meta-programming c++14