Bjarne Stroustrup 的 C++11 FAQ about templates包含以下单词:
This is rather standard functional programming done at compile time.
这是否意味着 his example with printf
编译后应该节点递归吗?我稍微简化了示例,所有禁用优化的编译器都会生成递归代码。例如,这里是 the output from g++ -O2
,它不是递归的,但 clang 无论如何都会保持它的递归。
我错过了什么?
附言我有错误。在此示例中,带有优化选项的 clang 编译代码与所有其他代码一样 - 以一种简单的方式(无递归)。但是没有优化 - 所有仍然使用递归编译。
最佳答案
Bjarne 关于编译时递归的评论指的是评估模板的方式,而不是生成代码的工作方式。例如,考虑这些模板:
template <typename... Args> struct Length;
template <> struct Length<> {
static const size_t value = 0;
};
template <typename First, typename... Rest> struct Length {
static const size_t value = 1 + Length<Rest>::value;
};
在这里,如果我们实例化Length<int, int, int, int>
然后
-
Length<int, int, int, int>
实例化 -
Length<int, int, int>
, 实例化 -
Length<int, int>
, 实例化 -
Length<int>
, 实例化 -
Length<>
这个过程是 Bjarne 所指的模板的纯功能递归扩展。这是扩展模板以生成代码的过程,它是递归的并在编译时完成,而不是将在编译器内部展开的实际生成的代码。 C++ 编译器可以自由地优化代码,但只要它不改变代码的基本含义,它认为合适。如果您有一个使用这种编译时递归风格的递归函数,编译器可能会对其进行优化,但不保证一定会。 C++ 标准对允许或不允许的优化类型没有任何限制,只是描述了所需的行为,因此没有关于此的规则。
希望这对您有所帮助!
关于c++ - 编译器是否保证优化模板生成的递归代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19189493/