objective-c - CG_INLINE 是做什么的?

标签 objective-c cocoa 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;
}

最佳答案

内联函数被编译到调用站点中,而不是被编译为单个函数代码块和使用函数时发出的调用指令。小心点,这会提供更快的速度和更多的缓存命中率。然而,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) */

所以...

  1. 对于提供适当版本的 __STDC_VERSION__ 的编译器(在本例中 >= C99),这意味着 static inline(因为 C99 native 允许这样做)
  2. 类似于 Metrowerks Codewarrior 或 C++ 编译器,它们原生支持内联
  3. 对于不支持 C99 的 GCC,它解析为 static __inline____inline__ 的使用是 GCC 特定的内联说明符,用于不支持内联的先前 C 标准:http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Alternate-Keywords.html .
  4. 如果所有这些都失败了,它不会理会内联 - 它只是 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/

相关文章:

objective-c - 我如何播种随机生成器并在 Objective-C 中创建一个随机整数

cocoa - 关于使用音频队列服务同步音频的建议?

objective-c - 如何在 Cocoa 中制作一个未装饰的窗口?

ios - UIPopovercontroller 在将新的 View Controller 推送到 navccontroller 后调整大小

ios - 如何将 Objective-c 中的数据类型匹配到 Swift 协议(protocol)?

ios - UIActivityViewController 无法将图像添加到 imessage

ios - NSUserDefaults 不保存数据 Objective C

macos - 由于 Mach-O header 中缺少 LC_VERSION_MIN,Mac App Store 分发的 Xcode 应用程序存档验证失败

iphone - 如何创建我自己的 Web API/Web 服务

iphone - iAd加载失败时不隐藏?