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