• 关于C++内联函数


    关于C++内联函数有以下实验:
    有三段测试代码
    1、手动展开内联函数。
    2、非内联函数。
    3、inline标记的内联函数。(函数只有一行代码,以确保函数被内联)
    测试三种情况:
    VS工程在Release版下的有关内联的三个设置选项
    1、/Ob0 禁用内联展开(默认情况下是打开的)。 
    2、/Ob1 只展开标记为 inline 或 __inline 的函数,或在类声明内定义的 C++ 成员函数中的函数。 
    3、/Ob2 展开标记为 inline 或 __inline 的函数和编译器选择的任何其他函数(由编译器自行进行展开,通常称作自动内联)。
    代码如下:
    三组实验的结果如下:
    实验结果补充:运行了非常多次,三个数值会有20以内的波动。
    通过以上实验,可以看出,无论是否使用内联标记inline,无论是否打开内置的设置级别。
    代码的三种情况,基本没有什么效率上的差异。
    即便设置了禁用内联展开,三段代码的效率基本一致。
    GetValue1(), GetValue2()的效率与展开一样。
    最终得出的结论是:无论是否使用内联标记,编译器都会根据实际优化自动内联某些满足要求的函数。
    另外在知乎上问相关问题,有做编译器的知友回应,编译器确实不管有无inline设置,都会把满足要求的函数(如少于设置行数)进行内联。
     
    这个结论非常重要。
    很多时候,我们会希望一些函数被内联以提高效率,所以我们会将它放置在类声明当中来实现。其实这破坏了类的声明。
    现在看来,完全没有必要将函数的实现放在类的声明当中。 
    另外,有些结构体,我们希望控制它的读写权限。一则C++没有好的语法支持。如果考虑通过函数来存取,又担心效率的问题,而又不喜欢太多内联函数。很多时候就直接访问结构体成员了。
    其实通过上面的结论,我们可以看出。
    在形式上,通过函数来存取变量。在Release版下,会自动优化展开,效果上与直接存取变量是一样的。

    P.S. 听说inline这个关键字,可能会被取消。因为函数展开与否,完全是编译器决定的,与是否有inline完全无关。
  • 相关阅读:
    原生js螺旋运动
    拉美电子游戏市场创收45亿美元
    ZOJ 3229 Shoot the Bullet
    Java的压缩、解压及压缩加密、解密解压 样例
    java环境变量配置
    git在myelispse中的安装
    java注解
    Python测试框架doctest
    python中的协程
    Flask log配置,实现按照日期自动生成日志文件
  • 原文地址:https://www.cnblogs.com/feihe0755/p/5602163.html
Copyright © 2020-2023  润新知