
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
函数的应用在许多软件开发项目中都是非常常见的一个编程开发功能,而本文我们就通过案例分析来简单了解一下,软件开发函数应用类型分析。
函数sort正在进行排序,而函数swap_if_less是sort使用的一个辅助函数。函数swap_if_less是一个小函数,并被sort多次调用,所以避免这种情况的好办法是将swap_if_less的主体复制到函数sort中,并避免所有与函数调用有关的开销。内联通常是由编译器完成的,但你也可以手动完成。我们已经介绍了手动内联,现在我们来介绍一下由编译器进行的内联。所有的编译器都会默认对小函数进行内联调用,但有些问题:
如果一个被调用的函数被定义在另一个.C或.CPP文件中,它不能被自动内联,除非启用了链接优化。
在C++中,如果类方法是在类声明中定义的,那么它将被内联,除非它太大。
标记为静态的函数可能会被自动内联。
C++的虚方法不会被自动内联(但也有例外)。
如果一个函数是用函数指针调用的,它就不能被内联。另一方面,如果一个函数是作为一个lambda表达式被调用的,那么它很可能可以被内联。
如果一个函数太长,编译器可能不会内联它。这个决定是出于性能考虑,长函数不值得内联,因为函数本身需要很长的时间,而调用开销很小。
内联会增加代码的大小,不小心的内联会带来代码大小的爆炸,实际上会降低性能。因此,好让编译器来决定何时内联和内联什么。
在C和C++中,有一个关键字inline。如果函数声明中有这个前缀,就是建议编译器进行内联。在实践中,编译器使用启发式方法来决定哪些函数需要内联,并且经常不理会这个提示。
如果通过剖析你的程序,你发现了一个对性能至关重要的函数,先你应该用__attribute__((flatten))来标记它,这样编译器就会内联该函数对其他函数的所有调用,其整个代码就变成了一个大函数。但即使你这样做了,也不能保证编译器真的会内联所有的东西。你必须确保内联没有障碍,正如已经讨论过的那样:
打开链接时的优化,允许其他模块的代码被内联。
不要使用函数指针来调用。在这种情况下,你会失去一些灵活性。
不要使用C++的虚拟方法来调用。你失去了一些灵活性,但有一些方法可以解决已经提到的这个问题。
只有当编译器不能自动内联一个函数时,你才会想手动内联。如果自动内联失败,编译器会发出警告,从那时起,你应该分析是什么原因阻止了内联,并修复它,或者选择手动内联一个函数。
关于内联的后一句话:有些函数你不希望内联。对于你的性能关键函数,有一些代码路径会经常被执行。但也有其他路径,如错误处理,很少被执行。你想把这些放在单独的函数中,以减少对指令缓存的压力。用__attribute__((cold))标记这些函数,让编译器知道它们很少执行,这样编译器就可以把它们从经常访问路径中移开。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。