美文网首页
iOS 宏和函数的区别

iOS 宏和函数的区别

作者: CrystalZhu | 来源:发表于2020-02-24 15:47 被阅读0次

在C语言和C++语言中,一个标识符被允许表示一个称为宏的字符串,它可以是常量、表达式、格式字符串等,程序中出现的所有宏名称都被宏定义中的字符串替换,下面来了解函数式宏定义与普通函数的区别。
我们以下面两行代码为例,展开描述:
函数式宏定义:#define MAX(a,b) ((a)>(b)?(a):(b))
普通函数 :MAX(a,b) { return a>b?a:b;}

(1)函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心。

(2)调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同。

如果MAX是个普通函数,那么它的函数体return a > b ? a : b; 要编译生成指令,代码中出现的每次调用也要编译生成传参指令和call指令。而如果MAX是个函数式宏定义,这个宏定义本身倒不必编译生成指令,但是代码中出现的每次调用编译生成的指令都相当于一个函数体,而不是简单的几条传参指令和call指令。所以,使用函数式宏定义编译生成的目标文件会比较大。

(3)函数式宏定义要注意格式,尤其是括号。

如果上面的函数式宏定义写成 #define MAX(a, b) (a>b?a:b),省去内层括号,则宏展开就成了k = (i&0x0f>j&0x0f?i&0x0f:j&0x0f),运算的优先级就错了。同样道理,这个宏定义的外层括号也是不能省的。若函数中是宏替换为 ++MAX(a,b),则宏展开就成了 ++(a)>(b)?(a):(b),运算优先级也是错了。

(4)若函数参数为表达式,则普通函数的调用与函数式宏定义的替换过程是不一样的。

普通函数调用时先求实参表达式的值再传给形参,如果实参表达式有Side Effect,那么这些SideEffect只发生一次。例如MAX(++a, ++b),如果MAX是普通函数,a和b只增加一次。但如果MAX函数式宏定义,则要展开成k = ((++a)>(++b)?(++a):(++b)),a和b就不一定是增加一次还是两次了。所以若参数是表达式,替换函数式宏定义时一定要仔细看好。

(5)函数式宏定义往往会导致较低的代码执行效率。

看下面一段代码:

int a[]={9,3,5,2,1,0,8,7,6,4};
int max(n)
{
return n==0?a[0]:MAX(a[n],max(n-1));
}

int main()
{
max(9);
return 0;
}

若是普通函数,则通过递归,可取的最大值,时间复杂度为O(n)。但若是函数式宏定义,则宏展开为( a[n]>max(n-1)?a[n]:max(n-1) ),其中max(n-1)被调用了两遍,这样依此递归下去,时间复杂度会很高。

尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现。

相关文章

  • iOS 宏和函数的区别

    在C语言和C++语言中,一个标识符被允许表示一个称为宏的字符串,它可以是常量、表达式、格式字符串等,程序中出现的所...

  • C/C++知识点分享(29)

    1.宏与内联函数的区别 解析:内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数...

  • C++ ----带默认形参的函数,inline(),模板函数,动

    带有默认值形参的函数 inline 函数 和宏定义的区别,宏定义原样替换,inline(),先进行运算,后替换 ...

  • 适配iOS11及iPhoneX几个有用小tip

    一、几个适配iPhoneX有用的宏/函数 1、宏 2、函数 iOS11适配 1、scrollview布局及tabl...

  • iOS 面试知识总结

    1.iOS define和const的区别 宏的用法:一般字符串抽成宏,代码抽成宏使用。const用法:一般常用的...

  • const 宏 static extern

    IOS 基础-define、const、extern、全局变量 const 与 宏的区别 : C语言宏高级用法 [...

  • C++ inline 和 #define

    inline是以代码膨胀(复制)为代价的,仅仅省去了函数调用的开销,从而提高函数的执行效率。 内联函数和宏的区别:...

  • C语言-函数式宏

    函数式宏 函数式宏(function-like macro)较之对象式宏可以进行更复杂的代换。 函数和函数式宏 函...

  • iOS零碎知识--C语言内存分配函数区别 malloc real

    iOS零碎知识--C语言内存分配函数区别

  • 宏和函数

    跟函数比较起来,使用宏辉浪费一些空间;(类似内联函数)但是避免了使用函数所必须的压栈、出栈,节省了时间;

网友评论

      本文标题:iOS 宏和函数的区别

      本文链接:https://www.haomeiwen.com/subject/zevvqhtx.html