首页 > 其他分享 >内联函数的探究

内联函数的探究

时间:2022-11-14 17:45:45浏览次数:39  
标签:调用 函数 编译器 函数调用 分钟 探究 内联

内联函数的引入

内联函数简单来说就是空间换时间,它会把函数的执行块内容替换(搬)到发在函数的调用位置执行,但是不发生函数调用,从而我们的代码量会增加,但是会没有函数调用所需要的开销。我们常说一般方式方法的引入都是为解决问题而来的,比如首先为什么我们需要函数?函数的引入其实简单来说,就是将一些通用的东西模块化。增强代码的可读性,作为一个通用的输入输出模型。内联函数这个东西的引入也是有它自己的原因的,个人意见,它是为了解决一些简单函数在调用时发生过多的但是又必须的开销产生的。这句话感觉可能难理解,但是我接下来一句话大家肯定就明白了,大家平时都打过网约车吧?函数调用就是打网约车,而上车之前我们有一个不可避免的操作就是等待司机达到我们的上车地点。那比如假设你从学校打车到家,当你的家离学校十公里,你打车肯定比你步行上学快捷太多了,假设你等车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

相关文章

  • 激活函数---->反向传播----》更新参数----》初始化
    神经元包含了非线性计算,用g()来表示,非线性计算由激活函数来实现,激活函数统一表示成g(z),常见的激活函数:1、sigmoid函数如果神经元采用sigmoid函数作为激活函数,那么单个神经元......
  • 巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from
    一.今日主要内容总览(重点)1.生成器(目的:帮助我们创建对象)(1)生成器的本质就是迭代器(2)一个一个的创建对象(3)创建生成器的方式:1.生成器函数......
  • 密码学C/C++语言实现学习笔记——基本运算函数
    密码学C/C++语言实现学习笔记——基本运算函数基础数据结构:typedefunsignedshortclint;typedefunsignedlongclintd;书中所使用环境unsignedshort是16位(2......
  • 函数式编程-Lambda表达式
    函数式编程-Stream流1.概述1.1为什么学?能够看懂公司里的代码大数量下处理集合效率高代码可读性高消灭嵌套地狱##############################################......
  • 10、 ARM 内联汇编学习笔记
    基本思想:随手记录一下ARM的内联汇编的基础语法,以便更深入的学习NCNN源码~​​ARMGCCInlineAssemblerCookbook​​ 参考官网(1)、基本的汇编语法结构为asmvolatile(co......
  • C++中sort函数、1.4最长公共子串
    sort()即为用来排序的函数,它根据具体情况使用不同的排序方法,效率较高。sort在实现时避免了经典快速排序中可能出现的会导致实际复杂度退化到O(n2)的极端情况。使用sort()......
  • C基础学习笔记——01-C基础第07天(字符串处理函数和函数)
    在学习C基础总结了笔记,并分享出来。01-C基础第07天(字符串处理函数和函数)目录:一、字符串处理函数(1)gets()(2)fgets()(3)puts()(4)fputs()(5)strlen()(6)strcpy()(7)strncpy()(8)strcat()(9)str......
  • python量化指标计算talib函数功能一览表
    安装talib库:pipinstalltalib 1#取个数据验证一下2set_token('')3data=history(symbol='SHSE.600519',frequency='1d',start_time='2015-01-01',......
  • 关于memset函数的详解
    一般用于数值和结构体的初始化这里仅仅说明对数组的初始化函数原型void*memset(void*s,intch,unsignedn);作用将s所指向的某一块内存中的每个字节的内容全部......
  • 2018-11-8-内置函数(2)
    主要内容一.1.locals()2.globals()3.complex4.binocthex5.abs6.divmod7.round8.pow(x,y,z=1)9.sum10.min/max11.reversed12.slice13.format14.bytes15.bytearray16.memory......