宏函数比普通函数效率高

总结一句话:一般情况下,普通函数调用有调用过程的开销,而宏函数是直接替换没有开销,因此效率更高。

  1. 函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以危险性高;但因为省去了函数的调用、返回、释放,所以效率比自定义函数高;那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现。

  2. 调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同。使用函数式宏定义编译生成的目标文件会比较

  3. 在执行复杂功能时,如递归,函数式宏定义往往会导致较低的代码执行效率。

  4. 一个函数调用过程所需要的信息一般包括以下几个方面:

  • 函数的返回地址;
  • 函数的参数;
  • 临时变量;
  • 保存的上下文:包括在函数调用前后需要保持不变的寄存器。
  1. 宏定义、宏函数不做语法检查,只是简单的文本替换。用空间换时间,对较简短的函数,用宏函数替代函数。

  2. 宏占用了编译时间,函数占用执行时间

  3. 宏的参数不占用存储空间,因为它只是替换字符串;调用函数时的参数传递就是特定变量,形式参数之间的信息传递。作为函数的局部变量,显然会占用内存。

  4. 函数调用需要付出一定的时间空间开销,因为系统在调用函数时必须保留场景,然后转移到被调用函数执行,调用完成,返回到调用函数,然后继续场景。这些操作显然不在宏中。

  5. 函数调用必须将程序执行的顺序转移给函数执行功能的程序内容后,存储在存储器中的地址,然后返回执行放置在函数之前. 此传输操作需要保存场景并记住执行位置,然后再传输至执行地址。回该站点后,必须还原该站点,并根据原始保存的地址继续执行。因此,必须有一个函数调用,时间和空间的成本将影响其效率。

  6. 宏就放在预处理的地方,代码在没有额外空间和时间开销的情况下展开,此功能效率更高。在编译之前的预处理阶段,宏已经不见了,它的C语言代码则被替换到被调用处了,这是它与函数的区别之一——根本不会有调用过程的开销

  7. 以下情况可以选择宏,其他情况最好选用函数

  • 一般来说,用宏来代表简短的表达式比较合适。
  • 在考虑效率的时候,可以考虑使用宏,或者内联函数。
  • 在头文件保护(防止重复包含编译),条件编译中的#ifdef#if defined以及assert的实现。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sxf1061700625/article/details/109205594