gpt4 book ai didi

gcc - g++/gcc在展开递归内联函数方面的效果如何?

转载 作者:行者123 更新时间:2023-12-04 22:20:10 27 4
gpt4 key购买 nike

我有递归但没有尾递归内联函数,我希望gcc展开递归。是的,我当然使用g++ -O3 -funroll-loops

inline void recurse_fun(..., unsigned depth = 0, unsigned max_depth = 40) {
if (++depth > max_depth) return;
for (auto i = ..., iend = ...; i != iend; i++) {
if (...) continue;
...
recurse_fun(...,depth,max_depth);
}
}


我可以通过手动处理 stack<...>对象来轻松地替换它,该对象应可以正确展开,但gcc不会那么优雅或可维护。

无论如何,我真的应该尝试对这两个版本进行概要分析,但是我很好奇是否有人可以自信地说某些最新的gcc版本可以正确地处理此问题。

最佳答案

GCC(至少是最新版本,如4.5或4.6)确实展开了一些尾部递归调用。
当然,您需要要求它进行优化(因此需要-O2-O3)。

要了解它在做什么,您可以


要求输出类似gcc -O3 -fverbose-asm -S yoursource.c的程序集
询问各种dump files,例如gcc -c -fdump-tree-all -fdump-ipa-all -O3 yoursource.c(还有其他转储文件)


请注意,GCC会打印很多(数百个!)转储文件。转储文件仅用于帮助GCC开发人员或GCC插件开发人员(或GCC MELT开发人员)。不要指望它们从GCC的一个版本到下一个版本都保持相同的格式。

转储文件的编号是没有用的:不是按时间顺序或逻辑顺序。

并且转储选项可能会在下一个GCC版本中更改(4.7,可能在2012年)

关于gcc - g++/gcc在展开递归内联函数方面的效果如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7797447/

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