我正在研究诸如此类的定义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;
}
内联函数被编译到调用站点中,而不是被编译为单个函数代码块和使用该函数时发出的调用指令。如果小心的话,这会提供更快的速度和更多的缓存命中。然而,历史inline
在 C 和 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) */
So...
- 对于提供的编译器
__STDC_VERSION__
适当版本的(在本例中> = C99),这意味着static inline
(因为 C99 本身允许这样做)
- 对于 Metrowerks Codewarrior 或 C++ 编译器也类似,它们支持
inline
原生地。
- 对于不支持 C99 的 GCC,它决定
static __inline__
。指某东西的用途__inline__
是 GCC 特定的内联说明符,用于以前的 C 标准,其中不支持内联:http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Alternate-Keywords.html.
- 如果所有这些都失败了,那么内联就不再麻烦了——它只是
static
.
为什么要费心所有这些定义呢?因为苹果公司在其历史上已经使用过相当少的编译器。在过去,Codewarrior C 编译器是用户选择的工具。自 OS X 以来,Apple 一直通过(最初是修饰符)GCC 使用 Objective C 和 C++。最近,他们正在过渡到 clang。这个宏涵盖了所有情况(并且,考虑到 Core Graphics 的新程度,我怀疑它是旧宏的修改版本)。
然而,现在许多编译器会忽略内联注释,因为它们的优化器比程序员提供的提示更好。在您自己的代码中,不要打扰它(以本机形式或通过此宏),除非您确实确定需要它(并通过分析证明它有用)。当然,你可能还想要static
- 上述建议涵盖了inline
行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)