C++关键字之inline

文章目录

  • C++关键字之inline
    • 1.inline关键字简介
    • 2.inline在成员函数中的使用
    • 3.使用inline的注意事项
      • 参考文献

C++关键字之inline

1.inline关键字简介

我们知道,每次调用函数时,都需要找到函数地址,寻找函数所在内存,执行函数代码,将控制权返还给调用者等一系列操作。但在面临一些代码量很短的函数时,每次调用都需要额外的调用开销是很不划算的。因为这些函数的代码量如此之少,以至于寻址、转移控制权等操作所花费的开销几乎和函数执行的开销一样大。在执行程序时,有些短小的函数会被多次反复调用。这时,我们可以使用inline关键字,inline关键字的作用就是在编译期时,将主调函数中的函数调用代码替换为内联函数内的代码以达到减少函数调用开销的目的

#include 

// 内联函数
inline void print() {
     
	// 实际执行的代码
	std::cout << "Hello World!" << std::endl;
}

// 主调函数
int main() {
     
	for(int i = 0; i < 5; i++) {
     
		// 函数调用代码
		print();
		// 由于该函数为内联的,因此该代码在编译期将被替换为下面的代码
		// std::cout << "Hello World!" << std::endl;
		// 这样,5次调用print(),就省去了5次寻址、存储函数信息、转移控制权等开销
	}
	return 0;
}

2.inline在成员函数中的使用

inline关键字也能够在成员函数中使用。

class AA {
     
	inline void show();
	/*
	虽然这个函数没有被声明为inline的,但是由于函数的
	定义在类的内部,因此它也会被实现为inline的
	*/
	int getOne() {
      return 1;}
};

inline void AA::show() {
     
	// 函数定义
}

3.使用inline的注意事项

正确的使用inline能够提高程序的开发效率,但有一些注意事项

  1. inline关键字不是强制行为
    需要注意的是,inline关键字并不是强制行为,也就是说,即使一个函数被声明为inline的,它也不一定能实现内联,inline关键字只是一个对编译器的建议,到底会不会内联取决于编译器。
  2. 使用函数指针调用内联函数将导致内联失效
    由于通过函数指针调用函数需要找到函数的地址再执行调用,但内联函数将再编译期扩展为函数实际代码,编译器并不会储存函数的地址。查找一个inline函数的地址时,为了不产生错误,编译器将做出“让步”,不会让该函数内联。
  3. inline函数不能包含过于复杂的结构
    对于含有复杂结构(switch语句、循环结构、递归调用)的inline函数,在编译期时,inline函数将在主调函数内扩展为很长的代码,考虑到代码膨胀等问题,编译器不会将inline函数内联。
  4. 构造函数、析构函数不宜内联
    析构函数、构造函数往往需要调用父类的析构函数、构造函数,可能会包含很多的代码,因此也不建议使用inline修饰。
  5. inline函数的声明和定义必须放在一份文件中
    因为inline函数将在编译期时内联,而函数的声明和定义只在链接时发生关联。如果将声明和定义放在不同的文件中,在编译期时将找不到内联函数的实现代码而导致内联失败。如果想要不同的文件都能够使用该内联函数,可以给每份文件一个内联函数的声明
// 实现文件
// 声明
inline void show();
......
// 定义
inline void show() {
     }

// 其他需要使用该内联函数的文件
inline void show();

参考文献

  • 《C++ Primer》
  • 《Effective C++》

你可能感兴趣的:(C++关键字,c++)