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

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"); }

就舒服多了.

猜你喜欢

转载自blog.csdn.net/baishuo8/article/details/82692196