Подтвердить что ты не робот

Зачем объявлять функцию C как статическую встроенную?

Я столкнулся с примером для C-функции, объявленной как:

static inline CGPoint SOCGPointAdd(const CGPoint a, const CGPoint b) {
    return CGPointMake(a.x + b.x, a.y + b.y);
}

До сих пор я объявлял служебные C-функции в файлах .h и реализовал их в .m файлах, как это:

CGPoint SOCGPointAdd(const CGPoint a, const CGPoint b) {
    return CGPointMake(a.x + b.x, a.y + b.y);
}

Я могу использовать эту функцию "inline" где угодно, и она также должна быть "статической", потому что она не связана ни с каким объектом, как с методом Objective-c. В чем смысл/преимущество указания "статического" и "встроенного"?

4b9b3361

Ответ 1

inline не означает, что вы можете использовать функцию "inline" (нормально использовать функции внутри других функций, для этого вам не нужно inline); он поощряет компилятор к созданию функции в коде, где она используется (как правило, с целью улучшения скорости выполнения).

static означает, что имя функции не связано с внешней связью. Если функция не была объявлена ​​ static, компилятор должен сделать ее внешне видимой, чтобы ее можно было связать с другими объектными модулями. Для этого компилятор должен включать отдельный не-встроенный экземпляр функции. Объявляя функцию static, вы разрешаете всем экземплярам ее быть встроенным в текущий модуль, возможно, не оставляя отдельного экземпляра.

static inline обычно используется с небольшими функциями, которые лучше выполняются в вызывающей процедуре, чем с помощью механизма вызова, просто потому, что они настолько короткие и быстрые, что на самом деле их лучше, чем вызов отдельной копии. Например:.

static inline double square(double x) { return x*x; }

Ответ 2

Если класс хранения является extern, идентификатор имеет внешнюю связь, а встроенное определение также предоставляет внешнее определение. Если класс хранения статический, идентификатор имеет внутреннюю связь, а встроенное определение невидимо в других единицах перевода.

Объявив функцию inline, вы можете направить компилятор для интеграции этого функционального кода в код для своих вызывающих абонентов (чтобы заменить полный код этой функции непосредственно на место, откуда он был вызван). Это ускоряет выполнение, устраняя служебные данные функции. Вот почему встроенные функции должны быть очень короткими.

Ответ 3

Встроенные функции предназначены для определения в файлах заголовков. Большие функции определены в файлах заголовков. Он должен быть статическим, чтобы он мог использовать только статические элементы.