作用
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。 用关键字 inline 放在函数定义的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开,假设我们将 max 定义为内联函数:
inline int max(int a, int b)
{
return a > b ? a : b;
}
则调用:cout << max(a, b) << endl;
在编译时展开为:cout << (a > b ? a : b) << endl; 从而消除了把 max写成函数的额外执行开销。
适用情况
1.一个函数被重复调用;函数只有几行,且不包含for,while,switch语句。
2.内联函数应该放在头文件中定义; 在class中定义的函数,除了虚函数的其他函数都会自动隐式地当成内联函数
// 定义
inline int functionName(int first, int second,...) {/****/};
// 类内定义,隐式内联
class A {
int doA() { return 0; } // 隐式内联
}
Effective C++ 30:理解 inline 函数的里里外外
c++17
c++17 inline还可以修饰变量:
- inline不能修饰局部变量
- inline修饰全局变量后使得所有包含其所在.h文件的编译单元都可以访问到同一个变量,且共享同一块内存。也就是说,它此时就是一个单例。inline static对全局变量的效果与static一样。
- inline不能单独修饰成员变量。inline static可以修饰成员变量,它的作用和static单独修饰差不多,但变量可以直接在头文件中初始化
- inline可以修饰全局函数和inline修饰全局变量一样,可以使得所有包含其所在.h文件的编译单元都可以访问到同一个函数,且共享同一块内存。inline static对全局变量的效果与static一样。
- 当修饰成员函数时,比较清晰的理解方式是,将inline和static看成独立的修饰符。
Header file “example.h”:
#ifndef EXAMPLE_H
#define EXAMPLE_H
#include <atomic>
// function included in multiple source files must be inline
inline int sum(int a, int b)
{
return a + b;
}
// variable with external linkage included in multiple source files must be inline
inline std::atomic<int> counter(0);
#endif
Source file #1:
#include "example.h"
int a()
{
++counter;
return sum(1, 2);
}
Source file #2:
#include "example.h"
int a() // yet another function with name `a`
{
++counter;
return sum(3, 4);
}
int b()
{
++counter;
return sum(5, 6);
}
inline specifier
用c++17的inline变量作为全局配置变量
c++17的inline、static和inline static变量和函数