NS_INLINE优于静态内联的优势是什么?

kee*_*n3d 19 cocoa static inline objective-c

看看NS_INLINE它的定义似乎使用它的优点static inline是编译器兼容性,这是正确的吗?在objective-c项目中应该NS_INLINE总是使用而不是static inlinec函数吗?

#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
Run Code Online (Sandbox Code Playgroud)

jus*_*tin 22

看一下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非常擅长他们的工作.同时,不正确使用内联可能会导致(任何)性能损失.例外(对于那些没有花费大量时间进行优化的人)当然是在花时间来衡量它所产生的差异时.

  • @ keegan3d,欢迎你.事实上,我假设你正在将它应用于正确的符号.我提到objc方法作为旁注(例如对于任何读者).然而,我试图做的更大的一点是,工具链中有很好的优化器,以及最近的优化进展(例如clang的LTO),它允许非常积极地优化许多C和C++符号 - 即使编译器看不到定义.这些进步进一步增加了手动调整成功的难度(例如使用`__attribute __((always_inline))`). (3认同)

Ken*_*ses 13

是的,这是为了兼容编译器,但我认为它更适合使用框架而不是自己的代码.当然,你可以自由使用它,但我不会打扰.

  • 是否会在Apple以外的平台上使用?使用GnuStep之类的?如果没有,那么没有.对于Mac OS X或iOS的开发几乎没有机会与`static inline`不兼容. (4认同)