Какое преимущество NS_INLINE над статическим встроенным? - программирование
Подтвердить что ты не робот

Какое преимущество NS_INLINE над статическим встроенным?

Глядя на определение NS_INLINE, кажется, что преимущество использования его поверх static inline - совместимость компилятора, это правильно? Должен ли NS_INLINE использоваться вместо static inline для функций c в проектах objective-c?

#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
4b9b3361

Ответ 1

Да, это для совместимости компилятора, но я думаю, что это больше для использования фреймворков, чем для вашего собственного кода. Конечно, вы можете использовать его, но я бы не стал беспокоиться.

Ответ 2

Глядя на определение NS_INLINE, кажется, что преимущество использования его по статическому встроенному - совместимость компилятора, верно ли это?

Только частично. Здесь вы должны оценить доминирующую инструментальную цепочку и спросить: "Почему static inline не использовался или почему он неадекватен?". Доминирующая инструментальная цепочка содержит атрибут __attribute__((always_inline)). Так что на самом деле есть две части:

  • a) Совместимость Таким образом, он добавляет совместимость для нескольких компиляторов.

  • b) Использование __attribute__((always_inline)) в доминирующей инструментальной цепочке. inline передал простой запрос inline. С помощью always_inline компилятор может по-прежнему оставлять за собой право не встраивать функцию (по понятным причинам). Тем не менее, он также говорит: "Поверьте мне, я хочу, чтобы этот встроенный компилятор, включив это, если возможно". Этот атрибут восстанавливает некоторую способность встроить программиста. Это может быть использовано для производительности, но я подозреваю (в данном случае), что он больше связан с сокращением числа частных экспортируемых функций, а не требований к производительности.

Должен ли NS_INLINE использоваться вместо статического встроенного в проектах objective-c?

Нет. __attribute__((always_inline)) следует зарезервировать для людей, у которых было много оптимизирующих опыт программ, и с использованием этого средства. Этот атрибут может применяться к функциям C, методам С++ и другим статическим вызовам. Он не может применяться к классам ObjC или экземплярам (которые являются динамическими). Я упоминаю, что, поскольку компилятор, оптимизатор и LTO очень хорошо разбираются в том, что они делают. Между тем, неправильное использование inlining может иметь (любое) несколько штрафных санкций. Исключение (для людей, которые не потратили значительное время на оптимизацию), конечно, когда требуется время для измерения различий, которые он делает.