2014-02-17 4 views
13

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

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

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

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

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

+0

Это сообщение может ответить на ваш вопрос http://stackoverflow.com/questions/145838/benefits-of-inline-functions-in-c – user376507

+0

взглянуть на этот ответ (на несколько иной вопрос) http://stackoverflow.com/a/7767858/464988 – MByD

ответ

2

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

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

+3

Я немного ржавый на своем Obj-C, но я думал, что статический C не имеет ничего общего с классами Obj-C и static (class), тем более что это функция не метод? – Joe

0

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

+0

Итак, если бы я был бабушкой, не имеющей степени Стэнфорда. Как бы вы мне это объяснили? – iamjustaprogrammer

+3

Я не писал этот ответ, но я начал с «читать учебник на языке С». – Joe

37

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

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

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

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

Я бы поднял ставку, если бы вы упоминали фактический прецедент в этом случае - простую функцию, которая, скорее всего, вызывается повторно. – Joe

+0

«inline» мне понятен, но «статический» по-прежнему не имеет смысла. Что вы подразумеваете под «внешне видимым»? И что вы подразумеваете под «модулем»? Мне еще нужно импортировать файлы заголовков, содержащие статические и нестатические функции. В чем разница в терминах бабушки? – iamjustaprogrammer

+1

@iamjustaprogrammer: в упрощенном виде, если это * не * статический, вы можете определить функцию в одном файле '.m' и вызвать ее из другого. Если он * статический, вы не можете этого сделать, вы можете вызывать его только из файла '.m', в котором вы его определяете. Если вы определяете его в файле '.h', то, очевидно, он будет определен в каждом файле' .m', в который вы включили этот заголовок. –

Смежные вопросы