gpt4 book ai didi

c - GCC 不尾调用优化递归函数

转载 作者:行者123 更新时间:2023-12-04 15:12:14 28 4
gpt4 key购买 nike

我为我的 uint128 结构编写了一个十六进制解析函数,它在内部只有两个 uint64_t - hi 和 lo。这是有问题的功能:

uint128_t parse_from_hex(const char *string, uint128_t previous_value, const size_t num_digits) {
if (string == NULL || string[0] == '\0')
return previous_value;

if (num_digits + 1 > 2 * SIZEOF_INT128) { // SIZEOF_INT128 is 16 - meaning 16 bytes
return UINT128_MAX; // the maximum value of 128bit uint, if we overflow
}

int64_t current_digit = parse_hex_digit(string[0]);
if (current_digit < 0)
return UINT128_ZERO; // a global variable which I use multiple times which represents a 0
return parse_from_hex(string + 1,
uint128_or_uint64(uint128_shift_left(previous_value, 4), (uint64_t)current_digit),
num_digits + 1);
}

出于某种原因,gcc 没有优化函数,即使在函数末尾显然进行了一次递归调用。解析函数中使用的其他函数没有任何副作用并返回一个新值,所以我不认为问题出在它们身上。我试过使 uint128_t 结构成员非常量(最初它们是非常量)以及函数参数非常量,但这也没有帮助。最初使用 Ofast 编译,但也尝试使用 O3 和 O2 - 没有运气。任何对这个问题更了解的人都可以帮忙吗?我以为我理解得很好,但显然我遗漏了一些东西。

最佳答案

正如@BillLynch 在评论中指出的那样——是 clang 出于某种原因没有优化功能,而不是 GCC。在我的电脑上,GCC 10.2.0 对功能进行了适当的优化,所以这里没有问题。

关于c - GCC 不尾调用优化递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64998174/

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