浏览我项目中C文件的汇编代码时,我发现函数在汇编输出中的顺序与它们在源文件中出现的顺序不同。这种重新排序的目的是什么,GCC又使用了哪些启发式算法来决定顺序呢?(这只是保存函数的数据结构产生的副作用吗?)这不是-freorder-functions,因为我没有使用-fprofile-arcs。
在过程间优化的后续阶段,采用了调用图的自底向上遍历来进行排序。您看到的就是这种排序方式。有一篇论文介绍了GCC这部分原始设计的相关内容,链接在这里(这篇论文比较久远,这些内容首次出现在GCC 3.4版本中)。 您可以使用-fno-toplevel-reorder(或者对于较早的GCC版本,使用-fno-unit-at-a-time)来防止重新排序,但这会禁用一些相关的优化。