关键词inline修饰的函数,叫作内联函数
- 编译器将函数调用直接展开为函数体代码
#include <iostream>
using namespace std;
inline void func() {
cout << "func()" << endl;
}
inline int sum(int v1, int v2) {
return v1 + v2;
}
int main() {
func();
int c = sum(10, 20);
cout << c << endl;
getchar();
return 0;
}
- 搜一下跳转地址,发现确实是直接展开为函数体代码
一旦变成内联函数时,一有调用就会不停的替换(展开);而一般的函数,函数的实现只有一份
*一下被替换,展开为四份
一般函数调用开始时开辟栈空间,结束时回收;内联函数直接展开,不存在函数调用(cout << "func()" << endl;直接执行这个操作)
- 可以减少函数调用的开销;会增大代码体积
inline void func() {
cout << "func()" << endl; //一般的函数这里只保留一份
}
int main() {
func(); //替换为这一句cout << "func()" << endl;
func(); //替换为这一句cout << "func()" << endl;
func(); //替换为这一句cout << "func()" << endl;
func(); //替换为这一句cout << "func()" << endl;
getchar();
return 0;
}
什么时候使用内联
1.函数代码体积不大
2.经常调用的函数
3.尽量不要内联超过10行代码的函数
4.有些函数即使声明为inline,最终编译器也不一定把它变成内联,比如递归函数
5.inline是尽量建议编译器去优化
VS看看内联的本质
release x86模式:发布模式,编译器做最大优化
不是内联函数也会变成内联
如要要看见inline的区别,需要右键解决方案-属性-优化 禁止-内联函数扩展 改成任何适用项
发现不存在调用函数call
用IDA打开看,发现内联函数的声明与过程都不见了,直接把函数调用替换成函数里面的内容
func(); //替换为这一句cout << "func()" << endl;
内联函数与宏类似,都有一个替换。宏是文本替换。
- 不要使用宏,使用内联
#include <iostream>
using namespace std;
#define add(v1, v2) v1 + v2 //宏,左边替换成右边
int main() {
int c = add(10, 20);
cout << c << endl;
getchar();
return 0;
}
c++表达式可以被赋值
int a =1;
int b =2;
(a = b) = 4; //赋值给了a