【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"); }
就舒服多了.