iOS 底层原理iOS 相关

OC 内联函数 inline

2019-07-26  本文已影响0人  yue_kyy

在iOS的一些框架中, static inline 是经常出现的关键字组合,主要是为了提高函数调用的效率。

示例

内联函数:

内联函数是指用 inline 关键字修饰的函数。在类内定义的函数被默认成内联函数。内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时类似于宏替换,使用函数体替换调用处的函数名。一般在代码中用 inline 修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。

inline 内联函数,作用是代替宏。

inline 和宏的区别:

inline 可以:

1、解决函数调用效率问题

2、函数之间调用,是内存地址之间的调用,当函数调用完毕之后还会返回原来函数执行的地址。函数调用有时间开销,内联函数就是为了解决这一问题。

3、不用 inline 修饰的函数,汇编时会出现 call 指令,调用 call 指令就是需要:

(1)将下一条指令的所在地址入栈

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

结论:为什么 inline 能替代宏?

优点相比于函数:

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

2、集成了宏的优点,使用时直接用代码替换

优点相比于宏:

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

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

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

inline 内联函数的说明

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

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

3、如果函数体出现循环,那么执行函数体内的代码的时间要比函数调用的开销大。

3、内联函数的定义需在调用之前。

参考文章:

https://www.jianshu.com/p/d557b0831c6a

https://www.jianshu.com/p/dd47d8ec8d07

上一篇下一篇

猜你喜欢

热点阅读