2010-04-29 8 views
0

Я смущен о том, как делать встроенные функции в C++ ....C++ встроенные функции

позволяет сказать эту функцию. как бы это быть повернуто к встроенной функции

int maximum(int x, int y, int z) 
{ 
    int max = x; 
    if (y > max) 
     max = y; 
    if (z > max) 
     max = z; 
    return max; 
} 
+7

Put «инлайн» перед определением функции. – 2010-04-29 16:36:06

+3

Вам также нужно будет поместить определение функции в заголовок (или иначе сделать его доступным в каждой единицы перевода ... –

+3

Имейте в виду, что ключевое слово 'inline' обычно не влияет на то, является ли функция встроенной или нет, с любым разумно современным компилятором. Что он будет делать, так это позволить вам определить функцию в нескольких местах, если все определения идентичны (например, вы могли бы иметь это, определенное в нескольких заголовках, если это было 'inline'). –

ответ

4

Как уже говорили другие, вы можете использовать inline ключевое слово, чтобы сообщить компилятору вы хотите, чтобы ваша функция встраиваемыми. Но ключевое слово inline - это просто компилятор hint. Компилятор может и будет игнорировать ваш запрос, если он хочет или нуждается.

Альтернатива, чтобы ваша функция шаблон функции, которая будет часто выдувается инлайн:

template<class Val> 
Val maximum(Val x, Val y, Val z) 
{ 
    Val max = x; 
    if (y > max) 
     max = y; 
    if (z > max) 
     max = z; 
    return max; 
} 
+1

Шаблоны функций не обязательно расширены встроенными. – sbi

+2

Niether - это функции 'inline'. Это просто альтернативный подход. –

+0

Уточненный текст. –

4

Чтобы разместить Neils ответ как фактический ответ:

inline int maximum(int x, int y, int z) 
.... 
1

inline просто говорит компилятору, что вы хотите, код функции скопированный везде есть Эталонный, его делает код немного быстрее (нет служебных вызовов функции), но больше (код скопирован). This page is more in depth.

+0

И компилятор не обязан на самом деле встраивать его, если он не " Так чувствую. Так что это может или не поможет. –

3

Если это определение функции отображается внутри определения class {}, то оно автоматически является уже встроенным.

В противном случае, как говорят другие, поставьте inline infront.

8

Для того, чтобы превратить его в функцию инлайн вам нужно сделать две вещи:

  1. объявим его рядный, используя ключевое слово inline.
  2. Убедитесь, что значение этой функции отображается в каждой единицы перевода, где используется. Это обычно означает, что вы должны поместить все определение функции в заголовочный файл.
2

Для того, чтобы функция инлайн использовать встроенный ключевое слово:

inline int maximum(int x, int y, int z) // note the inline keyword 
{ 
    int max = x; 
    if (y > max) 
     max = y; 
    if (z > max) 
     max = z; 
    return max; 
} 

Если функция является членом класса/структуры, то просто определив его внутри класса (как проставление к вне его) делает его в очереди.

Скажем у вас есть вызов:

int f = maximum(3, 4, 5) 

компилятор может расширяющийся вызов на что-то вроде:

int max = x; 
if (y > max) 
    max = y; 
if (z > max) 
    max = z; 
int z = max; 

Там какая-то накладные расходы на вызов функции, поэтому встроенные функции дают вам удобство функции вместе с производительностью макросов C. Но это не означает, что вы всегда должны их использовать, в большинстве случаев компилятор лучше решает, когда такие оптимизации нужны и, возможно, даже не соблюдают ваш запрос.

Вы можете прочитать больше о встроенных функциях и как (и когда), чтобы использовать их в C++ FAQ Lite и это GotW