c++ - 编译器是否保证优化模板生成的递归代码?

标签 c++ templates optimization c++11 recursion

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/

相关文章:

gcc - 几年前构建的gcc版本的编译器如何仍能针对最近发布的处理器进行编译?

c++ - Makefile 获取目录中的所有目标文件

c++ - 在 C++ 中,为重载函数强制转换为子类?

c++ - 使用C/C++宏生成函数签名

c++ - 模板参数推导失败

templates - 传递给嵌入模板的 Twig block

c++ - 为什么模板类型的初始化需要重复变量的类型?

python - 优化 3d 点哈希函数

c++ - in_addr 结构需要解释

optimization - 在 MySQL 中高效查询 15,000,000 行表