内联函数(inline function) 关键词inline修饰的函数,叫作内联函数 一旦变成内联函数时,一有调用就会不停的替换(展开);而一般的函数,函数的实现只有一份 一般函数调用开始时开辟栈空间,结束时回收;内联函数直接展开,不存在函数调用(cout << "func()" << endl;直接执行这个操作) 什么时候使用内联 VS看看内联的本质 内联函数与宏类似,都有一个替换。宏是文本替换。 c++表达式可以被赋值

  • 编译器将函数调用直接展开为函数体代码
#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;
}
  • 搜一下跳转地址,发现确实是直接展开为函数体代码
    内联函数(inline function)
关键词inline修饰的函数,叫作内联函数
一旦变成内联函数时,一有调用就会不停的替换(展开);而一般的函数,函数的实现只有一份
一般函数调用开始时开辟栈空间,结束时回收;内联函数直接展开,不存在函数调用(cout << "func()" << endl;直接执行这个操作)
什么时候使用内联
VS看看内联的本质
内联函数与宏类似,都有一个替换。宏是文本替换。
c++表达式可以被赋值

一旦变成内联函数时,一有调用就会不停的替换(展开);而一般的函数,函数的实现只有一份

*一下被替换,展开为四份

  • 可以减少函数调用的开销;会增大代码体积
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的区别,需要右键解决方案-属性-优化 禁止-内联函数扩展 改成任何适用项
内联函数(inline function)
关键词inline修饰的函数,叫作内联函数
一旦变成内联函数时,一有调用就会不停的替换(展开);而一般的函数,函数的实现只有一份
一般函数调用开始时开辟栈空间,结束时回收;内联函数直接展开,不存在函数调用(cout << "func()" << endl;直接执行这个操作)
什么时候使用内联
VS看看内联的本质
内联函数与宏类似,都有一个替换。宏是文本替换。
c++表达式可以被赋值
内联函数(inline function)
关键词inline修饰的函数,叫作内联函数
一旦变成内联函数时,一有调用就会不停的替换(展开);而一般的函数,函数的实现只有一份
一般函数调用开始时开辟栈空间,结束时回收;内联函数直接展开,不存在函数调用(cout << "func()" << endl;直接执行这个操作)
什么时候使用内联
VS看看内联的本质
内联函数与宏类似,都有一个替换。宏是文本替换。
c++表达式可以被赋值

发现不存在调用函数call
内联函数(inline function)
关键词inline修饰的函数,叫作内联函数
一旦变成内联函数时,一有调用就会不停的替换(展开);而一般的函数,函数的实现只有一份
一般函数调用开始时开辟栈空间,结束时回收;内联函数直接展开,不存在函数调用(cout << "func()" << endl;直接执行这个操作)
什么时候使用内联
VS看看内联的本质
内联函数与宏类似,都有一个替换。宏是文本替换。
c++表达式可以被赋值

用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