修订日期:2020/9/6
C++的运作实质是,C++是一种高级语言,编译器会对C++的代码进行处理,变成机器码。
然后这些机器码会一步一步的运行在内存中,所谓的分支语句,都是跳着运行了部分代码,进而实现分支的。
这个跳着运行,本质上是地址的变化,没错,机器码本身也是占据内存的。
函数是C++的一个重要分支,当我们调用一个函数的时候,比如 do_it(a,b); 这样简单的一句话,首先a和b作为参数会被保存在内存的堆栈里,然后程序的地址开始跳转,跳转到do_it部分的代码,然后初始化两个参数,a,b,并用堆栈的a,b给函数部分的a,b赋值,在这个过程中,赫然存在了三个a,b的拷贝。然后等do_it执行完毕之后,如果有返回值,还得把这个返回值保存在堆栈中,然后程序跳转到doit(a,b)在内存中的位置,重新执行代码,从该堆栈中拿返回值,该继续下一步就继续下一步。<del>(我现在也不知道为什么是三个拷贝了)<del>
而在这个过程中,遇到doit调用,然后开始寻找调用的代码的过程是可以避免的。那怎么避免呢?
C++提出的解决方案就是内联函数。内联函数干的事情就是在编译器这一层级,生成的机器码不再是进行调用的机器码,而是
直接将要执行的函数贴在当前的函数调用的位置上,然后在执行代码的时候,就不用再进行来回跳转了。
那么这个内联函数在什么时候使用呢?
就在这个函数的执行时间很短的时候,如果使用内联函数执行时间很长,函数调用的那点时间相对于函数执行时间,根本不需要考虑,那就很尴尬了,做这个操作就没意义了。
内联函数只适用于那种执行时间特别快的函数。
在C++中,内联函数的表现形式就是:
inline int fuck_she(int x)
{
return x * x;
}
有一个比较冷门的知识点,那就是内联函数和C语言的宏很相似。宏的作用也是将代码进行替换,只不过,相比于inline,宏比较僵硬,比如fuck_she(x++);,可以先传值,再自增。但是宏可以说是无脑替换,它必然是先自增,然后再进行计算,不太符合C++的设计理念。总之,建议用inline。
#define SQUARE(X) X*X;
这个内联函数,真是鸡肋啊,食之无味,弃之可惜。