前言
本篇博客我们来讲一讲内联函数这个东西,希望你可以从中学到东西,或是启发。
一、宏的一些问题
在c++里我们推荐用const enum去替代宏常量,inline去替代宏函数
为什么这样讲呢?因为宏在程序编译的预处理阶段,宏会直接粗暴地对其定义的代码进行替换它有很多的缺点
1.不能调试(预编译阶段就已经给你替换了)
2.没有类型安全的检查
3.有些场景非常复杂
就这个ADD函数我们都要套了一个括号再套一层,因为我们不套的话,宏就只是简单地替换,一些优先级问题就会暴露出来。
二、内联函数
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调
用建立栈帧的开销,所以内联函数提升了程序运行的效率
内联函数就是以空间换时间,如果编译器将函数当成内联函数处理,在编译阶段会用函数体替换函数调用,这样就会导致目标文件变大,好处就是减少了调用开销,是程序的运行效率提高了。
虽然内联挺好用但是内联只是向编译器发送一个请求,编译器可以拒绝,一般是函数规模小(75行都可能不执行),不是递归且频繁调用的函数采用内联。
还有要注意的一个点,就是内联函数不要声明和定义分离,不然会出现找不到链接的问题,因为内联函数是直接就在函数的地方展开的,不会生成跳转指令,所以就没办法找到这个函数的定义了,也就是找不到函数体了,要是实在想分离,你就要把函数定义拷贝到那个声明的源文件里去,当然你也可以把两个源文件一起包着
// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
f(10);
return 0;
}
总结
以上就是今天的博客要讲的内容,感谢各位的阅读,希望对你有帮助,当然如果你对博主写的内容有不同意见也可以评论,或是私信,我一定虚心接受。