Ответ 1
Встроенные функции скомпилируются на сайт вызова, а не компилируются как один блок кода функции и инструкции вызова, выдаваемые при использовании функции. С осторожностью это обеспечивает немного большую скорость и большее количество обращений в кеш. Однако история inline
в C и С++ является скалистой, поэтому этот макрос эффективно обеспечивает независимое от компилятора поведение static inline
. Глядя на определение:
#if !defined(CG_INLINE)
# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
# define CG_INLINE static inline
# elif defined(__MWERKS__) || defined(__cplusplus)
# define CG_INLINE static inline
# elif defined(__GNUC__)
# define CG_INLINE static __inline__
# else
# define CG_INLINE static
# endif
#endif /* !defined(CG_INLINE) */
Итак...
- Для компиляторов, предоставляющих
__STDC_VERSION__
соответствующей версии (в данном случае >= C99), это означаетstatic inline
(поскольку C99 допускает это изначально) - Аналогично для компиляторов Metrowerks Codewarrior или С++, которые поддерживают
inline
изначально. - Для GCC, не поддерживающих C99, он разрешает
static __inline__
. Использование__inline__
является спецификатором встроенного контура GCC для предыдущих стандартов C, где inline не поддерживается: http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Alternate-Keywords.html. - Если все это не удается, оно не беспокоит встроенный - это просто
static
.
Зачем беспокоиться обо всех этих определениях? Потому что Apple в своей истории прошла через несколько компиляторов. В дни ожидания компилятор Codewarrior C был инструментом выбора для пользователей. Начиная с OS X, Apple использует Objective C и С++ через (первоначально модификатор) GCC. В последнее время они переходят к clang. Этот макрос охватывает все случаи (и, учитывая, как новая Core Graphics, я подозреваю, это модифицированная версия более старого макроса).
Однако многие компиляторы в наши дни игнорируют встроенные аннотации, так как их оптимизаторы лучше, чем подсказки, предоставленные программистом. В своем собственном коде не беспокойтесь (в собственном виде или с помощью этого макроса), если вы не уверены, что вам это нужно (и доказали, что это полезно при профилировании). Конечно, вы все еще можете хотеть static
- вышеупомянутый совет охватывает поведение inline
.