#include<iostream>
inline int Add(int x, int y)
{
return (x + y) * 10;
}
using namespace std;
int main()
{
for (int i = 0; i < 10000; i++)
{
cout << Add(i, i + 1) << endl;
}
}
inline后的函数就是内联函数,特点:
// define宏函数
// 优点-- 不需要建立栈帧,提高调用效率
// 缺点-- 复杂,容易出错、可读性差、不能调试
//inline内联函数
//优点:不需要建立栈帧,提高调用效率,简单,不容易出错、可读性好、可以调试
//缺点:相当于把内联函数在使用到的位置展开(实际中有很多指令过程,这里简单的看成展开),如果函数特别大,那么最后在多个地方展开这个代码内存会爆炸。比如函数有50行,在100个地方使用,那么代码实际行数是50X100=5000。如果是一般函数50行,用在100个地方,代码实际行数是100+50=150。显然不能放代码量太大的函数因此只适用于短小的频繁调用的函数
// inline对于编译器仅仅只是一个建议,最终是否成为inline,编译器自己决定(通常是10行以内的简单函数),如果函数特别复杂,通常编译器不会把它认为是内联函数
// 像类似函数就加了inline也会被否决掉
// 1、比较长的函数
// 2、递归函数
// 默认debug模式下,inline不会起作用,否则不方便调试了
//内联函数声明和定义不能分离,不能出现下面这个情况:有声明在.h头文件里,定义在另一个源文件里
//头文件fun.h
#include<iostream>
using namespace std;
inline void fun(int x);
//源文件a.cpp
#include"fun.h"
void fun(int x){
cout<<x<<endl;
}
//源文件b.cpp
#include"fun.h"
int main(){
fun(10);//报错,将inline去掉后可以正常编译通过
return 0;
}
最好写内联函数直接完整地写在头文件里
下面讲解nullptr和NULL区别
首先看段代码
#include<iostream>
using namespace std;
void fun(int) {
cout << "fun(int)" << endl;
}
void fun(int*) {
cout<<"fun(int*)" << endl;
}
int main()
{
fun(0);
fun(NULL);
fun(nullptr);
return 0;
}
//输出fun(int),fun(int),fun(int*)
看张图
传统定义中c++中NULL是0,用nullptr代表空指针((void*)0),将0强转成void*类型,也就是第0个位置的地址