美文网首页iOS 相关
ios 内联函数,与宏的区别以及注意事项

ios 内联函数,与宏的区别以及注意事项

作者: 面条168 | 来源:发表于2017-05-08 11:18 被阅读540次

ios 中内联函数例子有:

@property(nonatomic)UIEdgeInsetsscrollIndicatorInsets;

typedefstructUIEdgeInsets{CGFloattop, left, bottom, right;// specify amount to inset (positive) for each of the edges. values can be negative to 'outset'}UIEdgeInsets;

UIKIT_STATIC_INLINE UIEdgeInsets UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right) {

UIEdgeInsets insets = {top, left, bottom, right};returninsets;

}

内联函数 是为了解决函数调用效率的问题

由于函数之间的调用,会从一个内存地址调用到另外一个内存地址,当函数调用完毕之后还会返回原来函数执行的地址,函数调用会有一定的时间开销,引入内联函数是为了解决这一问题

1-1 源代码            

没有使用 内联函数 static inLine 的main.m 汇编代码:

1-2 汇编代码

使用内联函数 static inLine 源代码:

1-1 源代码

使用内联函数 static inLine 的 main.m 汇编代码:

1-2 汇编代码

对比两者的mian.m的汇编代码,可以发现,没有使用`static inline修饰的内联函数的mian函数汇编代码中,会出现 call 指令!这就是区别!调用call指令就是就需要:

-(1)将下一条指令的所在地址(即当时程序计数器PC的内容)入栈

-(2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序)。


查看汇编代码的方法:选中main.m文件-->Xcode 菜单 --> Product --> Perform Action --> Assemble "main.m"


结论

1.使用 inline 修饰的函数,在编译的时候,会把代码直接嵌入调用代码中.就相当于用 #define 宏定义来定义一个 add 函数那样 与 #define 的区别是:

1)  #define 定义的格式要有要求,而使用 inline 则就就像平常写函数那样,只要加上 inline 即可

2)  使用 #define 宏定义的代码 ,编译器不会对其进行参数有效性检查,仅仅只是对符号表进行替换.

3)  #define 宏定义的代码,其返回值不能被强制转换的适合的转换类型.

2.在 inline 加上 "static" 修饰符,只是为了声明该函数只在该文件中可见! 也就是说,在同一个工程中,就算在其他文件中出现同名,同参数也不会引起函数重复定义的错误

inline 与 宏的区别

优点相比于函数:

1) inline函数避免了普通函数的,在汇编时必须调用call的缺点:取消了函数的参数压栈,减少了调用的开销,提高效率.所以执行速度确比一般函数的执行速度要快.

2)集成了宏的优点,使用时直接用代码替换(像宏一样);

优点相比于宏:

1)避免了宏的缺点:需要预编译.因为inline内联函数也是函数,不需要预编译.

2)编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。

3)可以使用所在类的保护成员及私有成员。

inline内联函数的注意事项

1.内联函数只是我们向编译器提供的申请,编译器不一定采取inline形式调用函数.

2.内联函数不能承载大量的代码.如果内联函数的函数体过大,编译器会自动放弃内联.

3.内联函数内不允许使用循环语句或开关语句.

4.内联函数的定义须在调用之前.

相关文章

  • ios 内联函数,与宏的区别以及注意事项

    ios 中内联函数例子有: @property(nonatomic)UIEdgeInsetsscrollIndic...

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

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

  • 第九章 内联函数

    简介:C++中预处理器宏存在的问题,在C++中如何用内联函数解决这些问题以及使用内联函数的方针和内联函数的工作机制...

  • C++ inline 和 #define

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

  • 宏、普通函数、内联函数之间的区别

    普通函数 调用时向栈中push函数帧,调用结束后pop函数帧。编译器会在函数调用语句的前后,插入入栈和出栈的辅助代...

  • 宏定义函数与内联函数

    宏定义函数 在c程序中,可以使用宏定义函数代替简单的函数,这样提高程序效率,预处理器用复制宏代码的方式代替函数调用...

  • NS_INLINE 内联函数

    1 内联函数与宏定义 C++ 语言支持函数内联,其目的是为了提高函数的执行效率(速度)。在C程序中,可以用宏代码提...

  • 内联函数与宏定义

    内联函数与宏定义 在C中,常用预处理语句#define来代替一个函数定义。例如:#define MAX(a,b) ...

  • 王道程序员求职宝典(十)函数,栈与队列

    函数 参数传递值传递指针传递引用传递指针引用*& 内联函数成员函数内联普通函数内联宏定义 默认参数从右向左设定默认...

  • iOS-inline内联函数

    iOS-inline内联函数

网友评论

    本文标题:ios 内联函数,与宏的区别以及注意事项

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