gpt4 book ai didi

c - 如何编写包装函数以便编译器有效地优化它?

转载 作者:行者123 更新时间:2023-11-30 14:58:39 25 4
gpt4 key购买 nike

我有一个函数,在返回链接列表的下一个节点之前进行基本的错误检查:

Node *next_node(Node *n) {
switch(type(n)){
case A:
case B:
.
.
case N:
return n->next;
default:
exit(1); //This is just a representation of my code handling error scenario.
}
}

其上还有更多包装函数,它们根据上述函数的返回值执行某些操作。

这些包装函数在我的整个代码库中被广泛使用。当我运行探查器时,我发现它们是耗时的例程,这实在是太多了。这对我来说确实有意义,因为从不同代码区域到这些函数有数千个函数调用,并且由于函数调用开销和/或指令缓存未命中,如此数量的调用肯定会花费时间。

我还知道编译器围绕这些做了一些优化,以便在生成汇编代码时可以内联它们。由于当前的实现方式,它似乎无法正常工作。

所以,我的问题是:

  1. 编写此类包装函数以便编译器可以优化它们以降低运行时间的常见方法是什么?
  2. 其他公司如何在其代码库中处理这种情况?

注1:上面的代码仅用于表示,整个代码库中有很多这样的包装函数。因此,如果有人对改进包装函数导致的运行时问题有任何想法,应该分享这个想法。

注2:我使用 gcc 作为编译器,我的代码库完全是 C 语言。

最佳答案

因此,您似乎处于低级优化的正确情况,因为您已经分析了代码并发现了一个耗时的函数。

假设您已经使用了编译器的更高优化级别,但不好的是这样的问题没有通用答案。我只能在这里给你一些提示:

  • 是否有一些多余的操作?如果是,您可以尝试确保只执行一次
  • 是否存在可以展开的复杂循环?没有太多收获,但以更长的代码为代价进行了一些测试
  • 可以选择汇编代码吗?如果是,您可以尝试用汇编语言编写全部或部分函数

但是您可以(应该?)也想知道是否:

  • 您的应用程序的总体结构是正确的 - 如果您能够减少调用函数,那么您在其中花费的时间就会更少......
  • 您确实需要在生产代码中进行测试。如果它们是断言而不是测试,则应仅在测试和调试版本中有条件地将它们包含在 #ifdef 中。

关于c - 如何编写包装函数以便编译器有效地优化它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43259954/

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