【问题标题】:What's the advantage of NS_INLINE over static inline?NS_INLINE 与静态内联相比有什么优势?
【发布时间】:2012-05-02 23:43:24
【问题描述】:

查看NS_INLINE 的定义,似乎使用它比static inline 的优势是编译器兼容性,对吗?在 Objective-c 项目中的 c 函数上是否应该始终使用 NS_INLINE 而不是 static inline

#if !defined(NS_INLINE)
    #if defined(__GNUC__)
        #define NS_INLINE static __inline__ __attribute__((always_inline))
    #elif defined(__MWERKS__) || defined(__cplusplus)
        #define NS_INLINE static inline
    #elif defined(_MSC_VER)
        #define NS_INLINE static __inline
    #elif TARGET_OS_WIN32
        #define NS_INLINE static __inline__
    #endif
#endif

【问题讨论】:

    标签: objective-c cocoa static inline


    【解决方案1】:

    查看 NS_INLINE 的定义,似乎使用它相对于静态内联的优势是编译器兼容性,对吗?

    只有一部分。你必须评估这里的主要工具链,并问“为什么static inline没有被使用,或者为什么它不够用?”。主要工具链包含属性__attribute__((always_inline))。所以这实际上有两个部分:

    • a) 兼容性因此它增加了对多个编译器的兼容性。

    • b) 在主要工具链中使用__attribute__((always_inline))inline 已演变为对 inline 的简单请求。使用always_inline,编译器仍然可以保留不内联函数的权利(出于显而易见的原因)。然而,它也说“相信我,我想要这个内联——编译器,如果可能的话,内联这个”。这个属性恢复了程序员的部分内联能力。这可以用于性能,但我怀疑(在这种情况下)它更多地与减少私有导出函数的数量有关,而不是性能要求。

    在 Objective-C 项目中是否应该始终使用 NS_INLINE 而不是静态内联?

    没有。 __attribute__((always_inline)) 应该留给那些在优化程序方面有很多经验的人,并且使用过这个工具。此属性可应用于 C 函数、C++ 方法和其他静态调用。它不能应用于 ObjC 类或实例方法(它们是动态的)。我提到这一点是因为编译器、优化器和 LTO 非常擅长它们的工作。同时,内联的不当使用可能会导致(任何)几个性能损失。例外情况(对于没有花费大量时间进行优化的人)当然是当人们花时间衡量它所产生的差异时。

    【讨论】:

    • 谢谢,非常深入!我已经更新了我的问题,以清楚地表明我在谈论 Objective-c 项目中的 c 函数。
    • @keegan3d 不客气。实际上,我假设您将其应用于正确的符号。我提到了 objc 方法作为旁注(例如,对于任何读者)。但是,我试图要说明的更重要的一点是,工具链中有很好的优化器,以及最近在优化方面取得的进展(例如 clang 的 LTO),它允许对许多 C 和 C++ 符号进行非常积极的优化-- 即使定义对编译器不可见。这些进步进一步增加了成功手动调整的难度(例如使用__attribute__((always_inline)))。
    • 新的FOUNDATION_STATIC_INLINE 宏怎么样?这只是定义为static __inline__。我可以使用它吗,即static __inline__static inline 相同吗?
    • @MattDiPasquale __inline__ 只是一个复古的编译器扩展。你应该只使用inline 关键字,除非你需要一个编译器扩展,它早于C 中inline 关键字的标准化(很少有objc 开发人员需要这个)。但是是的,__inline__ 在我想到的那些上下文中等同于inline(例如 MSC-C90 和 GCC-C90)。在上面的示例中,您可能会看到它与其他编译器的兼容性——并且仅适用于 C 和 ObjC。
    【解决方案2】:

    是的,它是为了编译器的兼容性,但我认为它更多是为了使用框架而不是你自己的代码。当然,您可以随意使用它,但我不会打扰。

    【讨论】:

    • 如果代码是别人使用的库,那你会推荐使用NS_INLINE吗?
    • 它会在苹果以外的平台上使用吗?用 GnuStep 之类的?如果没有,那么没有。为 Mac OS X 或 iOS 开发与 static inline 不兼容的可能性几乎为零。
    猜你喜欢
    • 2016-07-04
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2018-02-19
    • 2012-11-08
    相关资源
    最近更新 更多