Cal*_*ius 20 c++ standards inline-code
C++旨在为程序员提供选择,即使这使程序员可以选择错误.
如果它是这样设计的,为什么没有标准的方法来强制编译器内联一些东西,即使我可能是错的?
或者我可以问为什么inline关键字只是一个提示?
我想我别无选择.
在OOP世界中,我们在对象上调用方法,并且应该避免直接访问成员.如果我们不能强制访问内联,那么我们就无法编写高性能但仍可维护的应用程序.
(我知道很多编译器都用自己的方式来强制内联,但它很难看.使用宏来创建类的内联访问器也很难看.)
编译器总是比程序员做得更好吗?
Aam*_*mir 18
编译器如何内联递归函数(特别是如果编译器不支持Tail-call优化,即使它确实如此,该函数也不是Tail-call optimize-able).
这只是编译器应该决定内联是否实用的一个原因.还有其他一些我现在无法想到的.
编译器总是比程序员做得更好吗?
不,并非总是......但程序员更容易出错,并且不太可能在几年内保持最佳调整.最重要的是,如果函数非常小(对于至少一个公共/重要的代码路径),内联仅有助于性能,但是当然,它可以帮助大约一个数量级,这取决于许多事情.程序员评估通常是不切实际的,更不用说仔细考虑一个函数是多么微不足道了,而且阈值可能因编译器实现选择,命令行选项,CPU模型等而有所不同.有很多东西可能会突然膨胀函数 - 任何非内置类型都可以触发各种不同的行为(特别是模板),运算符(偶数new)的使用可能会被重载,调用约定和异常处理步骤的冗长程度通常对程序员来说并不明显.
可能的情况是,如果编译器没有内联的内容足够小,以至于如果它被内联就会期望有用的性能改进,那么编译器意识到某些实现问题并不会让它变得更糟.在那些灰色的情况下,编译器可能会采用任何一种方式,而你只是超过某个阈值,性能差异无论如何都不太可能显着.
此外,一些程序员(包括我自己)可能是懒惰和故意滥用,inline作为一种方便的方式将实现放在头文件中,绕过ODR,即使他们知道这些函数很大,如果编译器(如果编译器,那将是灾难性的)要求)实际内联他们.这并不排除强制内联关键字/符号......但它只是解释了为什么很难改变对当前inline关键字的期望.