内联函数是指编译器可以(但不一定)通过直接将函数代码插入调用位置来替换函数调用的函数。这是通过使用关键字 inline 来实现的。
inline 给编译器提供建议,但不是强制要求:如果函数太复杂,可以被忽略。限制和风险:
示例:
inline int add(int a, int b) { return a + b; } struct X { int get() const { return value; } int value; }; // get() 将被视为内联
问题: 关键字inline是否保证该函数会在所有调用位置被内联?
答案: 不保证。编译器根据内部启发式方法独立决定是否进行内联替换。inline 只是建议。
故事
在金融系统中编写了一个常用的日志记录器,包含数十个大型内联函数。随着系统的增长,二进制文件的大小增加了数倍,导致链接时间增加和服务器上的缓存效率降低。
故事
在迁移跨平台软件时发现,一些编译器(例如MSVC和GCC)对内联的处理不同:某些函数没有展开成内联,某些则相反,导致在不同平台间应用程序的速度和大小存在难以复制的差异。
故事
开发人员只在头文件中声明内联函数,但将实现放在单独的cpp文件中。因此,在链接时出现了multiple definition或unresolved external错误,因为内联函数必须在头文件中定义。