• C/C++ 之内联函数


      在C中可以使用#define提高执行效率,但是容易出错,而在C++ 支持函数内联,其目的亦是如此。

    (1)inline的工作原理:

      对于任何内联函数,编译器在符号表里放入函数声明(包括名字,参数类型,返回值类型)。如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表中。在调用一个内联函数时,编译器首先检查调用是否正确,比如进行类型安全检查,进行类型转换等。如果正确,内涵函数的代码将会直接替换函数调用,于是省去了函数调用的开销。

      这个与#define是不同的,因为#define不能进行类型安全检查,或者自动类型转换。如果内联函数时成员函数,对象的地址this会被放在合适的地方,这个也是预处理不能办到的。

    (2)inline的编程风格:

      关键字inline必须与函数定义提放在一起才能使函数成为内联,仅将inline放在函数声明中是无效的,比如:

      inline void foo(void);    // 仅与声明放在一起无效    

      void foo(void)

      {...} 

      与定义体放在一起是有效的,比如:

      void foo(void);     

      inline void foo()

      {....}

      这样可以看出,inline是一种用于“实现”的关键字,但是个人感觉,在声明中也写上inline,虽然这样可能导致声明与定义混为一谈,但是这样很容易让你的小伙伴们一目了然。

    (3) inline的使用:

      在一定程度上,使用inline的确可以提高函数的执行效率,但是依然建议慎用内联。原因在于内联是以代码复制为代价的,仅仅省去了函数的调用开销,但是执行函数体内代码的时间变长。所以建议:inline函数体内的代码不宜过长。

      当然,一些编译器会根据函数的定义体,自动取消不值得的内联,不过目前我还没注意到。等发现了再做补充^_^

  • 相关阅读:
    工具:统计jQuery中各字符串出现次数
    读Ext之八(原生事件对象的修复及扩充)
    querySelector和getElementById通过id获取元素的区别
    读Ext之十(解析JSON)
    Safari/Chrome中placeholder属性实现不完整
    读Ext之十一(通过innerHTML创建元素)
    各浏览器中innerHTML实现差异(2)
    读Ext之五(Dom的低级封装)
    读Ext之十二(在各个位置插入元素)
    读Ext之四(事件的低级封装)
  • 原文地址:https://www.cnblogs.com/SkyflyBird/p/4575138.html
Copyright © 2020-2023  润新知