问题描述
今天我想测试Clang如何转换两个函数的递归能力,并注意到即使使用已知指数,即使使用constexpr,递归也不会被优化。
#include <array>
constexpr unsigned int pow2_recursive(unsigned int exp) {
if(exp == 0) return 1;
return 2 * pow2_recursive(exp-1);
}
unsigned int pow2_5() {
return pow2_recursive(5);
}
pow2_5被编译为对pow2_recursive的调用。
pow2_5(): # @pow2_5()
mov edi,5
jmp pow2_recursive(unsigned int) # TAILCALL
但是,当我在要求在编译时知道结果的上下文中使用结果时,它将在编译时正确计算结果。
unsigned int pow2_5_arr() {
std::array<int,pow2_recursive(5)> a;
return a.size();
}
编译为
pow2_5_arr(): # @pow2_5_arr()
mov eax,32
ret
以下是Godbolt中完整示例的链接:https://godbolt.org/z/fcKef1
那么,我在这里错过了什么吗?有什么可以在运行时更改结果的原因,是为什么无法以与pow2_5_arr相同的方式优化pow2_5?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)