MrH*_*Hen 15 cocoa objective-c ios
我关注着的东西,如定义CGPoint关于如何创建自己的功能提示,但我不知道的目的CG_INLINE.幕后发生了什么?
CG_INLINE CGPoint
CGPointMake(CGFloat x, CGFloat y)
{
CGPoint p; p.x = x; p.y = y; return p;
}
CG_INLINE CGSize
CGSizeMake(CGFloat width, CGFloat height)
{
CGSize size; size.width = width; size.height = height; return size;
}
Run Code Online (Sandbox Code Playgroud)
Ada*_*ght 24
内联函数被编译到调用站点中,而不是被编译为单个功能代码块和使用该函数时发出的调用指令.小心,这提供了更多的速度和更多的缓存命中.但是,inlineC和C++ 的历史很不稳定,因此这个宏有效地提供了编译器独立的static inline行为.看看定义:
#if !defined(CG_INLINE)
# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
# define CG_INLINE static inline
# elif defined(__MWERKS__) || defined(__cplusplus)
# define CG_INLINE static inline
# elif defined(__GNUC__)
# define CG_INLINE static __inline__
# else
# define CG_INLINE static
# endif
#endif /* !defined(CG_INLINE) */
Run Code Online (Sandbox Code Playgroud)
所以...
__STDC_VERSION__适当版本的编译器(在这种情况下> = C99),这意味着static inline(因为C99本身允许)inline本机支持的Metrowerks Codewarrior或C++编译器.static __inline__.使用的__inline__是以前C标准的GCC特定内联说明符,其中内联不受支持:http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Alternate-Keywords.html.static.为什么要烦扰所有这些定义?因为Apple在他们的历史中,已经通过了一些公平的编译器.在过去的日子里,Codewarrior C编译器是用户的首选工具.自OS X以来,Apple一直通过(最初修饰符)GCC使用Objective C和C++.最近,他们正在过渡到铿锵声.这个宏涵盖了所有的情况(并且,考虑到新的Core Graphics是如何,我怀疑是旧宏的修改版本).
但是,如今许多编译器会忽略内联注释,因为它们的优化程序优于程序员提供的提示.在你自己的代码中,不要打扰它(以原生形式,或通过这个宏),除非你真的确定你需要它(并通过分析证明它有用).当然,您可能仍然想要static- 上述建议涵盖了inline行为.
CG_INLINE是一个宏,用于将方法标记为内联函数.确切的语法依赖于(是?)编译器,并通过预处理器检查为编译器选择了正确的语法.
对于目前的海湾合作委员会,它应该解决static inline.
标记的函数的要点inline是编译器可以插入调用函数的函数体的等效函数,而不是进行(稍微更昂贵的)函数调用.所以如果你有:
inline int foo(int a, int b)
{
return a + b;
}
void bar(int a, int b)
{
NSLog(@"%d", foo(a, b));
}
Run Code Online (Sandbox Code Playgroud)
然后允许编译在内部将其转换为:
void bar(int a, int b)
{
NSLog(@"%d", a + b);
}
Run Code Online (Sandbox Code Playgroud)
这节省了一个函数调用,在某些体系结构上这可能代价很高,并且可能非常明显,例如当你在循环中调用函数几千次时.
需要注意的是它只意味着编译器可以做这种转变,这并不意味着它没有做到这一点.取决于编译器设置.
| 归档时间: |
|
| 查看次数: |
3346 次 |
| 最近记录: |