UIKIT_STATIC_INLINE UIEdgeInsets UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right) {
UIEdgeInsets insets = {top, left, bottom, right};
return insets;
}
UIKIT_STATIC_INLINE UIOffset UIOffsetMake(CGFloat horizontal, CGFloat vertical) {
UIOffset offset = {horizontal, vertical};
return offset;
}
…
define UIKIT_STATIC_INLINE static inline
这个函数是一个静态的内联函数!结论是:
引入内联函数是为了解决函数调用效率的问题
由于函数之间的调用,会从一个内存地址调到另外一个内存地址,当函数调用完毕之后还会返回原来函数执行的地址。函数调用会有一定的时间开销,引入内联函数就是为了解决这一问题。
那么引用内联函数到底有什么区别呢?
“为了解决函数调用效率的问题”
如何解决呢?
如果用static inline声明一个内联函数,
ifndef inline_inline_h
define inline_inline_hstatic inline int add(int a, int b){
return a+b;
}#endif
http://blog.csdn.net/chsadin/article/details/47982923
CALL(LCALL)指令执行时,进行两步操作:
(1)将程序当前执行的位置IP压入堆栈中;
(2)转移到调用的子程序。
CALL与RET结合使用,当CALL调用的子程序运行到RET命令时,压入堆栈的IP弹出,跳出子程序,开始执行CALL的下一条语句。
一般来说,执行一条CALL指令相当于执行一条PUSH指令加一条JMP指令。
call指令是调用子程序,后面紧跟的应该是子程序名或者过程名。
JMP是汇编语言中的无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在储存器中指出。
1.call和ret指令都是转移指令,它们都修改IP的值,或同时修改CS和IP的值。它们经常共同用语实现子程序的设计。
2.ret指令用栈中的数据,修改IP的内容,从而实现近转移。
3.retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。
4.CPU执行ret指令时,相当于进行:
pop IP
执行retf指令时,相当于进行:
pop IP
pop CS
5.CPU执行call指令时,进行两步操作:
(1)将当前的IP或CS和IP压入栈中;
(2)转移