Objective c 什么';与静态内联相比,NS_内联的优势是什么?

Objective c 什么';与静态内联相比,NS_内联的优势是什么?,objective-c,cocoa,static,inline,Objective C,Cocoa,Static,Inline,看看NS_INLINE的定义,似乎使用它比静态INLINE的优势在于编译器兼容性,对吗?在objective-c项目中,在c函数上是否应该始终使用NS\u INLINE而不是static INLINE #if !defined(NS_INLINE) #if defined(__GNUC__) #define NS_INLINE static __inline__ __attribute__((always_inline)) #elif defined(__MWER

看看
NS_INLINE
的定义,似乎使用它比
静态INLINE
的优势在于编译器兼容性,对吗?在objective-c项目中,在c函数上是否应该始终使用
NS\u 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

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

从NS_INLINE的定义来看,使用它比静态INLINE的优势在于编译器兼容性,对吗

只是部分。您必须评估这里的主要工具链,并询问“为什么没有使用
静态内联
,或者为什么它不充分?”。主要的工具链包含属性
\uuuuu attribute\uuuuu((始终\u内联))
。这实际上有两个部分:

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

  • b) 在主要工具链中使用
    \uuuuuu属性(始终为内联)
    <代码>内联已演变为对
    内联
    的简单请求。使用
    始终内联
    ,编译器仍然可以保留不内联函数的权利(出于明显的原因)。然而,它也说“相信我,我想要这个内联编译器,如果可能的话,内联它”。此属性恢复了一些内联到程序员的功能。这可以用于提高性能,但我怀疑(在本例中)它更多地与减少私有导出函数的数量有关,而不是与性能要求有关

在objective-c项目中是否应该始终使用NS_内联而不是静态内联

#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

否。
\uuuuu属性(始终为内联)
应保留给具有丰富程序优化经验并使用此功能的人员。此属性可应用于C函数、C++方法和其他静态调用。它不能应用于ObjC类或实例方法(是动态的)。我之所以提到这一点,是因为编译器、优化器和LTO在这方面做得非常好。同时,内联的不当使用可能会导致(任意)多个性能损失。例外情况(对于那些没有花大量时间进行优化的人来说)当然是当一个人花时间去衡量它所带来的差异时。

如果代码是为其他人使用的库编写的,那么你会建议使用
NS_INLINE
吗?它是否会在苹果以外的平台上使用?用GnuStep之类的?如果没有,那么就没有了。为Mac OS X或iOS开发的应用程序几乎不可能与
静态内联
不兼容。谢谢,非常深入!我已经更新了我的问题摘要,以明确我在谈论objective-c项目中的c函数。@keegan3d不客气。事实上,我以为你在用正确的符号。我提到了objc方法作为旁注(例如,对于任何读者)。然而,我试图做的更大的点是,在工具链中有良好的优化器,以及在优化中的相当新的进展(例如CLAN的LTO),这允许对C和C++符号进行非常积极的优化——即使在定义对于编译器不可见时也是如此。这些进步进一步增加了手动调谐成功的难度(例如,使用
\uuuuu属性((始终在线))
)。新的
FOUNDATION\u STATIC\u inline
宏如何?这只是定义为
static\uuuuu inline\uuuu
。我可以使用它吗,也就是说,
static\uuuu inline\uuu
static inline
相同吗?@MattDiPasquale
\uu inline\uuu
只是一个追溯编译器扩展。您应该只使用
inline
关键字,除非您需要在C中
inline
关键字标准化之前的编译器扩展(很少有objc开发人员会需要这个)。但是,是的,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。在上面的示例中,您可能会看到它与其他编译器的兼容性——并且仅适用于C和ObjC。