C++学习-内联inline函数
一、定义-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;