天天看点

C++学习之路-内联函数inline的使用一、定义-definition二、inline内联函数使用举例-example三、不建议使用内联函数的情形四、宏定义函数(#define function …)五、宏定义函数与内联函数的区别六、不相关学习tips

C++学习-内联inline函数

  • 一、定义-definition
  • 二、inline内联函数使用举例-example
  • 三、不建议使用内联函数的情形
    • 1.为什么函数体代码过多不建议使用inline函数
  • 四、宏定义函数(#define function ...)
  • 五、宏定义函数与内联函数的区别
  • 六、不相关学习tips

一、定义-definition

使用inline修饰函数的声明或者实现,就可以使其变成内联函数。C++中支持内联函数,其目的是为了提高函数的执行效率。

具体的作用就是:将函数调用,替换成函数体代码,避免了调用函数时开辟栈空间和回收栈空间所带来的内存开销

二、inline内联函数使用举例-example

  • 被inline修饰的函数叫做内联函数,内联函数调用时,不会开辟栈空间,而是直接把函数体代码拷贝过来。函数体积增大了,但是执行效率变高了。
//内联函数的定义
inline void fuction()
{
	cout << "fuction" << endl;
	cout << "fuction" << endl;
	cout << "fuction" << endl;
	cout << "fuction" << endl;
}

int main(int argc, char **argv)
{
	//由于此函数为内联函数,则没有调用函数这回事,
	//也就是直接把函数调用,替换成函数体的代码,放在这里
	fuction();
	//其实这块代码就是cout << "fuction" << endl;
	//				 cout << "fuction" << endl;
	//				 cout << "fuction" << endl;
	//				 cout << "fuction" << endl;

	getchar();
	return 0;
}
           

三、不建议使用内联函数的情形

  • 函数为递归函数,即是用inline修饰,也不会变成内联函数
因为内联是把函数调用转为函数体代码,而递归函数里又存在函数调用,所以就循环了,导致inline不起作用
//这个函数就是递归函数,即使用inline修饰,也不会变成内联函数
inline void run()
{
	run();
}

int main(int argc, char **argv)
{
	//由于此函数为递归函数,即使被inline修饰,也会当做普通函数来看待
	run();

	getchar();
	return 0;
}
           
  • 函数体代码较多,超过10行以上,不建议使用inline内联函数
内联函数会增加代码的体积,因为直接把函数体放在了main函数里。如果函数体数量很多,就会使得main函数中的代码量剧增,这是我们不想看到的。

1.为什么函数体代码过多不建议使用inline函数

函数体积大时,就是函数体代码过多,如果使用内联函数,会增加机器码的体积,也就会使得生成的exe文件更大。由于函数调用不可能只调用一次,所以函数体的代码量是翻倍增长的。

四、宏定义函数(#define function …)

  • 宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。
//宏定义函数
#define add(v1,v2) ((v1)+(v2))

int main()
{
	add(1,2);//3

	getchar();
	return 0;
}
           

五、宏定义函数与内联函数的区别

  • 内联函数和宏都可以减少函数调用的开销;
  • 对比宏定义,内联函数多了语法检测和函数特性,起码看起来还是个函数;
  • 宏一个比较重要的特性就是,它只是简单的文本替换,不会检测运算符的优先级之类的;
  • 宏定义函数是不可以调试的,而内联函数是可以调试的;
  • 对于C++而言,宏定义一个最大的缺点就是无法操作类内的私有成员

六、不相关学习tips

  • Debug模式下不会产生任何内联操作,只有release模式才有内联这回事
  • 函数调用时,首先开辟栈空间,调用结束时,会回收栈空间,整个过程有内存的开销
  • C++的表达式是可以被赋值的,但C语言是不可以的
(a > b ? a : b)表达式的意思是:
	if a>b return a;  
	else return b;
           

继续阅读