gpt4 book ai didi

c++ 支持模板元编程中的最后一次调用优化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:47:24 24 4
gpt4 key购买 nike

我正在阅读有关 C++ 模板的内容,并且想对比计算从 0 到 N 的总和的函数的两种不同实现方式。

不幸的是,我遇到了问题,想通过示例解决几个问题:

朴素求和代码:

#include <stdio.h>

template<int N>
struct Sum {
// Copied the implementation idea from Scott Meyers book
// "Effective C++". Is there a better way?
enum { value = N + Sum<N - 1>::value };
};

template<>
struct Sum<0> {
enum { value = 0 };
};

int main() {
// Works well in this case, but gives compilation error, if
// it's called with a larger value, such as 10000
// (error: template instantiation depth exceeds maximum of 900").
// How to improve the program properly, that it would
// not give compile time error?
printf("%d\n", Sum<100>::value);
}

现在我的改进想法是使用累加器:

template<int Acc, int N>
struct Sum {
enum { value = Sum<Acc + N, N - 1>::value };
};

// Is that an appropriate way of writing the base case?
template<int Acc>
struct Sum<Acc, 0> {
enum { value = Acc };
};

但是,当在 Ubuntu 操作系统上使用简单的 g++ 编译时:

int main() {
// Still gives the "depth exceeded" error.
printf("%d\n", Sum<0, 1000>::value);
}

因此,我主要关心的是:

是否有任何现代 c++ 编译器支持最后一次调用优化模板元编程?如果是,为此类优化编写代码的合适方法是什么?

最佳答案

Does any modern c++ compiler support last call optimisation for template metaprogramming? If yes, what is an appropriate way to write code for such optimisation?

不,这没有意义。模板实例化不是函数调用...最后/尾部调用优化与此处无关。与函数调用不同,模板实例化不是 transient 的,自动变量可以回收;相反,每个模板实例化都成为编译器状态下的新类型。

关于c++ 支持模板元编程中的最后一次调用优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34088049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com