编程C++ 开发人员 / 系统程序员

什么是C++中的内联函数,内联关键字是如何工作的?在大型构建中,过度使用内联函数的实际限制和风险是什么?

用 Hintsage AI 助手通过面试

答案。

内联函数是指编译器可以(但不一定)通过直接将函数代码插入调用位置来替换函数调用的函数。这是通过使用关键字 inline 来实现的。

  • 关键字 inline 给编译器提供建议,但不是强制要求:如果函数太复杂,可以被忽略。
  • 实际上,在类内定义的函数默认被视为内联函数。
  • 内联函数通常用于短小、频繁调用的函数,以避免调用开销。

限制和风险:

  • 当调用次数很大并且在不同文件中包含同一header函数时,代码重复的常见情况会显著增加二进制文件的大小。
  • 编译器可能不会展开复杂的函数或调用其他内联函数的函数。

示例:

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错误,因为内联函数必须在头文件中定义。