C++:宏函数和内联函数(一看就明了)

函数的调用过程中需要一定的开销,例如:保护调用的运行环境,参数传递,执行调用的指令等。所以调用函数会降低程序的执行效率,尤其是在多次频繁的进行调用时会大大的降低程序的效率。
C++提出了两种解决方案:宏函数和内联函数
使用这两种方式都可以节省在函数调用方面所带来的时间和空间开销。两者都采用了空间换时间的方式,在调用地方进行展开。

宏定义又称为宏代换,宏替换,简称为“宏”

宏定义的分类
1.不带参数的宏定义

  • 格式:#define 标识符 字符串
  • 其中的标识符就是所谓的符号常量,也称为“宏名”。预处理(预编译)工作也叫做宏展开:将宏名替换为字符串

2.带参数的宏定义(宏函数)

  • 格式:#define 宏名 (参数表)字符串
  • 除了一般的字符串替换,还要做参数代换

宏函数的优缺点
优点:

  • 增强代码的复用性。在预处理的阶段会将使用宏函数的位置用宏展开,少了函数压栈等开销,因此可以提高程序运行的效率。
  • 提高代码的可读性。

缺点:

  • 不方便调试宏。(因为预编译阶段进行了替换)
  • 导致代码可读性差,可维护性差,容易使用错误
  • 不能进行类型检测,程序不安全

内联函数

inline关键字修饰的函数称之为内联函数,C++编译器在编译时会在调用内联函数的地方进行展开,这样就会很大程度上提高程序运行的效率,没有了函数压栈的开销。
内联函数特性

  • inline用空间换取了时间,减少了调用函数的额外开销,但长代码或者有循环/递归的函数不适宜使用内联函数;
  • inline对于编译器而言只是一个建议,编译器会自动进行优化,如果定义为Inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联;
  • inline必须与函数定义放在一起,才能成为内联函数,只把inline放在声明前是无效的;
  • 定义在类中的成员函数默认定义为内联函数。
  • 内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句。如果内联函数的函数体过于复杂,编译器会自动把内联函数当成普通函数来进行执行。

内联函数与宏函数的区别和联系

  • 它们都可以提高代码的运行速度;
  • 宏函数在预编译的收进行展开,内联函数在编译时展开;
  • 宏只是做简单的替换,内联函数直接嵌入到目标代码中;
  • 内联函数有类型检测、语法判断等功能,但宏没有,
    内联函数满足函数的性质,比如有返回值、参数列表这些;
  • 内联函数可以进行调试,宏不可以;
  • 宏不能访问对象的私有成员,但是定义在类内的内联函数可以访问。

版权声明:本文为qq_44851228原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。