在早期的C++中,inline关键字通常被认为是劝说程序员使用setters和getters代替直接访问数据成员的一种方式。今天,大多数的编译器都比一般程序员更加清楚什么函数更适合inlining。此外,inline的使用可以导致繁重的维护问题,敏感的bugs和无用功。
一个典型的函数由一行代码组成。定义它inline在开始的时候感觉很合理:
class File
{
public:
int get_descriptor() const;
//..
private:
int _fd;
//..
};
inline int File::get_descriptor() const
{ return _fd;} //fine, a slim function body
考虑到由于设计的改变,移动到新的系统或者OS中等等,get_descriptor()现在包含的15行代码。很显然,不能再定义inline。那么,维护者会记得将inline从这个函数的定义中移动吗?
另外一个问题在被代码库使用的inline函数中浮现。许多程序使用的是静态连接,这个自动访问一个新的DLL,并且在没有终端用户改变他们的程序的情况下进行繁殖代码改变。但是,如果一个inline函数的整体改变了它将不能维护二元位的兼容性,在这种情况下,用户必须重新编译他们的代码。
使用inline的危险超过了它的好处,如果你的代码需要被优化,通常使用专业的模型来优化他们。使用inline仅仅是代码部分需要被优化的时候,并且你发觉只有inline才可以改变它们的性能时才使用。除此之外,避免使用inline。
本文作者:Danny Kaley 是一个有着14年丰富经验的系统分析师和软件工程师。他擅长C++和面向对象的程序设计。