我正在研究诸如 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;
}
最佳答案
内联函数被编译到调用站点中,而不是被编译为单个函数代码块和使用函数时发出的调用指令。小心点,这会提供更快的速度和更多的缓存命中率。然而,C 和 C++ 中 inline
的历史并不平坦,因此该宏有效地提供了独立于编译器的 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) */
所以...
- 对于提供适当版本的
__STDC_VERSION__
的编译器(在本例中 >= C99),这意味着static inline
(因为 C99 native 允许这样做) - 类似于 Metrowerks Codewarrior 或 C++ 编译器,它们原生支持
内联
。 - 对于不支持 C99 的 GCC,它解析为
static __inline__
。__inline__
的使用是 GCC 特定的内联说明符,用于不支持内联的先前 C 标准:http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Alternate-Keywords.html . - 如果所有这些都失败了,它不会理会内联 - 它只是
static
。
为什么要考虑所有这些定义?因为 Apple 在他们的历史中,已经通过了相当多的编译器。在过去,Codewarrior C 编译器是用户的首选工具。自 OS X 以来,Apple 一直通过(最初是修饰符)GCC 使用 Objective C 和 C++。最近,他们正在过渡到 clang。这个宏涵盖了所有情况(而且,考虑到 Core Graphics 有多新,我怀疑它是旧宏的修改版本)。
然而,如今许多编译器会忽略内联注释,因为它们的优化器比程序员提供的提示更好。在您自己的代码中,除非您真的确定需要它(并且已经通过分析证明它有用),否则不要理会它(以 native 形式,或通过此宏)。当然,您可能仍然需要 static
- 上述建议涵盖了 inline
行为。
关于objective-c - CG_INLINE 是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6207440/