zoukankan      html  css  js  c++  java
  • define 与 inline

    define

      就是代码替换,在编译阶段进行简单的代码替换,大量用于宏定义开关,以及定义表达式和常量,如:

    1.开关定义

      #define CONFIG_OPENED

      使用:

      #ifdef CONGFIG_OPENED

      .....

      #else

      .....

      #endif

    2.常量定义

      #define NAME "TEST"

      使用:

      printf("the name is %s", NAME);

      #define HAVE_DONE 1

      使用:

      if(HAVE_DONE) {

      } else {

      }

    3.表达式定义

      #define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))

      使用:

      int m = ExpressionName(5,6); 

      讲一下最后这种表达式定义的使用方式,其特点就是代码替换,使用的地方简介明了,因为是编译阶段替换,所以不会像普通函数调用那样,涉及到参数的出栈入栈,效率就高;但这种使用方式也有问题,这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。为此,在C++中,就引入了inline关键字,内联函数(内嵌函数)。

    inline

    内联函数有下面几个特点:

      1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样直接进行替换展开),没有了调用的开销,效率也很高。
      2. 很明显,类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
      3. inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。

      在何时使用inline函数:
      首先,你可以使用inline函数完全取代表达式形式的宏定义。
      另外要注意,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。内联函数最重要的使用地方是用于类的存取函数。

    Reference

          百度百科:inline

  • 相关阅读:
    二维数组中的查找
    排序算法——冒泡、选择、插入
    排序算法——快速、归并
    最小的K个数
    重建二叉树
    反转链表
    LeetCode 278 第一个错误的版本
    LeetCode 929 独特的电子邮件地址
    LeetCode 38 报数
    模型参数初始化
  • 原文地址:https://www.cnblogs.com/flyme/p/4565991.html
Copyright © 2011-2022 走看看