内联函数的引入
内联函数简单来说就是空间换时间,它会把函数的执行块内容替换(搬)到发在函数的调用位置执行,但是不发生函数调用,从而我们的代码量会增加,但是会没有函数调用所需要的开销。我们常说一般方式方法的引入都是为解决问题而来的,比如首先为什么我们需要函数?函数的引入其实简单来说,就是将一些通用的东西模块化。增强代码的可读性,作为一个通用的输入输出模型。内联函数这个东西的引入也是有它自己的原因的,个人意见,它是为了解决一些简单函数在调用时发生过多的但是又必须的开销产生的。这句话感觉可能难理解,但是我接下来一句话大家肯定就明白了,大家平时都打过网约车吧?函数调用就是打网约车,而上车之前我们有一个不可避免的操作就是等待司机达到我们的上车地点。那比如假设你从学校打车到家,当你的家离学校十公里,你打车肯定比你步行上学快捷太多了,假设你等车5分钟(发生函数调用各种入栈),车辆行驶十公里20分钟(执行函数主体),车停到对应位置(函数返回出栈),你共花30分钟。但是步行十公里,一般可能你需要2小时。而且随着距离的增加,打车这个举动显得越发的机智,越发的高效快捷。但是换一种情景下,你家离学校200米,你还是打车,那等车5分钟,车辆行驶1分钟,车停到对应位置5分钟,共计11分钟。但是我们步行只需要2分钟即可完成。说到这里大家可能应该也许必须得恍然大悟了。内联函数原来就是提供这样一种步行方式(当然这里不准确的比喻是函数主体的执行其实两者没啥差距)。当我们所需要的仅仅是那200米的距离时,似乎打车就不是最好的选择,不是最好的也就是肯定可以优化的,内联函数就应运而生啦!
探究内联函数
内联函数能否调用
这个问题经过我的测试是不能的,原因也很简单,内联函数由于是将函数代码块替换到函数的位置,而不是跳转到某个函数地址去执行,在编译时,在内联函数定义的内部文件中,内联函数根本就不会被记录在中间文件(.o)的符号表中,所以它根本就不能发生外部调用,链接时,链接器不能找到该符号的定义,也就找不到该符号的地址,那自然是没法处理的。但是如果把内联函数放在.h里就很香了(内联函数的定义直接定义在.h里,而不是声明,虽然我们一般.h是放声明),因为.h会把内联定义直接放在.c中,然后还可以被其他需要文件多次调用而不产生符号冲突,但是试验了下居然失败了,这个问题可以探究一下。
内联 inline与 stiatic
可能有人说内联函数与static有啥关系,其实还真有,这也是我想到前面内联函数能否被调用这个问题时想到的,因为static修饰的变量也不能够被外部调用,但是static修饰的符号是放在local区,他跟普通函数一样,它是被记录在符号表中的,而且它有地址的,发生函数调用时,会跳转到对应的函数地址执行。
内联函数与普通函数
内联函数具有普通函数的优势,比如增加了可读性,无论编译器怎么处理得到最终的可执行文件,我们写代码时,内联函数还是比直接把一段段的东西直接放在代码中好的,其次还可以如同函数一样做参数检查,这还是挺好的。
内联函数的使用条件
这个地方自己亲测了一下,你的代码值得内联,你只要开了优化选项,编译器会帮你处理的,如果你的代码不符合内联条件,比如函数中的东西过于复杂,有些循环之类的,或者没有打开优化选项(比如-O2 -O3)即使你加了inline修饰,编译器也不会去那样处理它。总之,我个人感觉这个玩意儿我们理解明白就好,平时该用编译器会处理,不该用自己也别瞎处理。简单记录一下,上面多次提到了符号表,编译链接的一些东西,大家不太明白可以去看看编译链接相关的东西,就从源文件到可执行文件的整个过程。
标签:调用,函数,编译器,函数调用,分钟,探究,内联 From: https://www.cnblogs.com/luo-qi/p/16889735.html