gpt4 book ai didi

c++ - 为什么在这里使用 boost::multiprecision::cpp_int 会影响尾调用优化

转载 作者:行者123 更新时间:2023-11-30 05:17:33 29 4
gpt4 key购买 nike

我有一些模板代码,编译器可以尾调用优化大多数数据类型,但不能优化其他数据类型。代码实现pow()

template<typename T, typename U>
void powRecurse(T& x, U& y, T& acc)
{
if(y == 0) {
acc = Identity<T>;
return;
}
if(y == 1) {
acc = acc * x;
return;
}
if(y % 2 == 1) {
acc = acc * x;
y = y - 1;
}
x = x*x;
y = y/2;
powRecurse<T, U>(x, y, acc);
}

template<typename T, typename U>
T tailPow(T x, U y)
{
T rv = Identity<T>;
powRecurse<T, U>(x, y, rv);
return rv;
}

参数 T 的类型似乎对尾调用优化没有影响,我尝试过的任何类型都可以使用参数 U 的正确类型进行尾调用优化。如果参数 U 是 uint64_t,则编译器可以尾调用优化.如果它是 boost::multiprecision::cpp_int 那么编译器不会尾调用优化。

我还尝试将 uint64_t 包装在一个类中,并将模板包装器包装在一个 int 类型上,这两个尾调用都进行了优化。

有什么理由不应该尾调用优化?显然我可以循环这个,但我真的只是想了解这里的语言或编译器问题。

最佳答案

惰性评估意味着所有“递归”函数调用实际上是不同的函数模板实例化。

参见例如这里有类似的讨论:

因此,您可以通过选择退出惰性求值模板表达式(boost::multiprecision::et_off,如链接中所述)来获得您期望的所有 tail-coll 实现细节,但一定要检查减少的代码大小和感知到的 TCO 优化是否实际上导致性能 boost 。

实际上,某些算法受益于可以跳过常见子表达式、重新排序无损操作等的表达式模板。

关于c++ - 为什么在这里使用 boost::multiprecision::cpp_int 会影响尾调用优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42080151/

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