Clang好奇地错过了递归constexpr函数的优化

问题描述

今天我想测试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 (将#修改为@)