C++ 编程
外观
inline 关键字声明一个内联函数,该声明是对编译器的(非强制性)请求,要求将特定函数进行 内联扩展;也就是说,它建议编译器在使用该函数的每个上下文中插入函数的完整主体,因此它用于避免通过从代码中的一个地方跳转到另一个地方,然后再返回以执行子程序(如在子程序的朴素实现中所做的那样)而产生的开销。
inline swap( int& a, int& b) { int const tmp(b); b=a; a=tmp; }
当函数定义包含在类/结构体定义中时,它将是 *隐式内联*,编译器将尝试自动内联该函数。在这种情况下,不需要 inline
关键字;在该上下文中添加 inline
关键字是合法的,但冗余的,并且 良好的风格 是省略它。
示例
struct length
{
explicit length(int metres) : m_metres(metres) {}
operator int&() { return m_metres; }
private:
int m_metres;
};
*内联* 可以 是一种优化,也可以是一种悲观优化。它可以增加代码大小(通过在多个调用站点复制函数的代码)或减少代码大小(如果函数的代码在优化后小于调用非内联函数所需的代码大小)。它可以提高速度(通过允许进行更多优化并避免跳转)或降低速度(通过增加代码大小,从而导致缓存未命中)。
内联的一个重要副作用是,更多代码可供优化器访问。
将函数标记为内联还会影响链接:多个内联函数定义是允许的(只要每个定义都在不同的翻译单元中)只要它们是相同的。这允许内联函数定义出现在头文件中;在头文件中定义非内联函数几乎总是错误的(虽然函数模板也可以在头文件中定义,并且通常会这样做)。
主流 C++ 编译器,如 Microsoft Visual C++ 和 GCC 支持一个选项,允许编译器 *自动内联* 任何合适的函数,即使是那些没有标记为内联函数的函数。编译器通常比人更能判断某个特定函数是否应该内联;特别是,编译器可能不愿意或不能内联人要求它内联的许多函数。
过度使用内联函数会大大增加耦合/依赖关系和编译时间,还会使头文件作为接口文档的效用降低。