一、简单介绍
这里想起来还是要总结一下关于inline关键字的问题,尽管C和C++有着自己的语音规范和标准,但其实不同的编译器对有些关键字的实现是不一样的,比如说inline。就好比说在C99标准中inline :用于同一c/cpp文件内部被调用处展开;对外部文件来说函数不可用。而GCC编译器的实现则是inline :对同一c/cpp文件,函数将会在被调用处展开;对外部文件,此函数等同于"extern"函数。
二、内联函数的用处
在C语言中如果一些函数不断的被调用不断的被调用的话,那么就会不断的去开辟函数栈,从而导致栈空间被不断的消耗,而且我还需要程序计数寄存器不断的去记录调用的地址,而且还需要多生成几条汇编指令。所以为了解决这样的问题,所以就引入了inline关键字,表示的就是内联函数。
如果一个函数被声明为内联的,那么编译器就会去展开一个函数调用时,该函数的代码会被插入到调用该函数当中,这能起到优化性能的操作,但是其实我们如果去声明的函数为内联,这其实只是一个请求,编译器是可以去忽略它的,编译器可能会展开内联函数调用,也可能不展开。这样其实是比较好的,因为编译器自己会去做优化,有的时候可能函数展开比较好,但是有的时候函数展开不太好。就比如说有些编译器就含有编译优化选项,会根据这些选项自己进行判断。
三、关于内联函数的优化方面
先看下一个代码,这里就是在printfPoint的函数中去调用了point函数,首先我们要明确一个概念,就是我们在使用printfPoint函数的时候是会去使用到栈空间的以及寄存器,在执行的过程中会把临时变量x和y写入到栈中,然后之后还得把x和y传入到point函数中,也就是先保存到寄存器中然后传入到point函数中进去,然后之后还会被复制到printPoint的函数栈中。也就是说会做很多不必要的操作。所以我们在使用内联函数的时候其实就避免了这部分的操作,所以性能会得到提升。
void point(int x,int y)
{
printf("%d--%d",x,y);
}
void printfPoint()
{
int x=1;
int y=2;
point(x,y);
}
内联函数的优点和缺点,这里就简单的列出几个。
内联函数可能会使代码速度更快,就是上面的例子所讲,会移除一些不必要的操作
内联函数可能会增加可执行文件的大小,因为如果一个内联函数,我在很多的地方都有调用,如果都要展开的话,肯定是增加了可执行文件的大小了。
内联函数可能会使代码速度更慢:因为如果调用了很多次内联函数可能会使代码变多,这样的话在使用分页虚拟内存的系统上,这就有可能会导致性能下降。换句话说,如果可执行文件过大,系统就可能会花费很多时间到磁盘上获取下一块代码。等等,其实内联函数的优缺点是由很多方面所决定的。
这里扩展下关于分页虚拟内存其实就是指物理内存不够用了,就采用虚拟内存技术来满足需要。就比如你的内存条是256M,你的程序却要创建一个2G的数据区,那么不是所有数据都能一起加载到内存(物理内存)中,有一部分数据要放到其他介质中(比如硬盘),待进程需要访问那部分数据时,在通过调度进入物理内存。