内联函数存在的结论是:
- 引入内联函数是为了解决函数调用效率的问题
- 由于函数之间的调用,会从一个内存地址调到另外一个内存地址,当函数调用完毕之后还会返回原来函数执行的地址。函数调用会有一定的时间开销,引入内联函数就是为了解决这一问题。
- 不用inline修饰的函数, 汇编时会出现 call 指令.调用call指令就是就需要:
- (1)将下一条指令的所在地址入栈
- (2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序).
原因
动机
内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数。 一个小内存空间的函数非常受益。
如果没有内联函数,编译器可以决定哪些函数内联 。 程序员很少或没有控制哪些职能是内联的,哪些不是。 给这种控制程度,作用是程序员可以选择内联的特定应用
影响
结论
为什么inline能取代宏?
-
优点相比于函数:
-
1) inline函数避免了普通函数的,在汇编时必须调用call的缺点:取消了函数的参数压栈,减少了调用的开销,提高效率.所以执行速度确比一般函数的执行速度要快.
-
2)集成了宏的优点,使用时直接用代码替换(像宏一样);
-
-
优点相比于宏:
-
1)避免了宏的缺点:需要预编译.因为inline内联函数也是函数,不需要预编译.
-
2)编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
-
3)可以使用所在类的保护成员及私有成员。
-
inline内联函数的说明
- 1.内联函数只是我们向编译器提供的申请,编译器不一定采取inline形式调用函数.
- 2.内联函数不能承载大量的代码.如果内联函数的函数体过大,编译器会自动放弃内联.
- 3.内联函数内不允许使用循环语句或开关语句.
- 4.内联函数的定义须在调用之前.
参考链接:
1.http://www.cnblogs.com/pengyingh/articles/2405718.html
2.https://objccn.io/issue-6-2/