欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【C/C++】关键字 inline : 内联函数

程序员文章站 2022-03-16 08:47:55
...

Backto C/C++ Index

inline, 顾名思义, 就是在函数被调用的时候, 不是通常意义上的去函数地址调用, 而是把函数的代码展开嵌入到源代码中, 从而加快运行速度.

适用于 短小却大量调用的 plain code, 按 Google 的编程规范, 一般少于10行的不包含循环,递归等的 plain code 才考虑 inline.

inline 修饰函数是给编译器看的, 别把我编译成一个独立函数, 把我inline 到其他所有需要我的地方去.因此, 编译器必须看到完整的 implementation, 仅仅给一个 declaration 是不够的, 是会报错的,是会报链接失败错误的.

也就是说, 如果按通常代码写法,

//foo.h
void bar();

//foo.cpp
inline void bar()
{
    /*这个编译不过, 会报链接错误滴*/
}
  • inline 修饰 declaration, 可有可无, 那就规定省略掉.
  • inline 修饰 implementation, 必须有, 而且必须整个函数暴露给编译器看.

当然了,现在编译器优化做得好, 你随便inline, 它判断不应该inline 也直接给你忽略掉,按普通函数对待.

最佳实践 Best Practice

我当前采用的策略是, 就按正常的代码写, 现在 .h 中 declaration, 然后在 .cpp 中 implementation, implementation 完之后发现这段精美的小代码可以 inline, 就 Ctrl + x.h 中去, 加 inline 关键字然后后置. 也就是这样

//foo.h
// declaration area
void bar();
void tata();

//inline functions implementation area
inline void bar()
{
    /*Hello World, This is OK!*/
}

// foo.cpp
void tata()
{
    /*for - loop,*/
    /*recursion, */
    /* prevent inline!*/
}

举个栗子

比如说 代码中很多 printf("\n"); 就显得很不美观, 而且输入切换也麻烦. 改造一下, 写成内联函数

//helper.h

void PrintLineBreak();

inline void PrintLineBreak(){ printf("\n"); }

就舒服多了.

相关标签: inline