Объектно-ориентированное программирование на C++


Встраиваемые функции


Итак, давайте вспомним наш пример.

struct _3d

{

double x, y, z;

 double mod () {return sqrt (x*x + y*y +z*z);}

 double projection (_3d r) {return (x*r.x + y*r.y + z*r.z) / mod();}

 _3d operator + (_3d b);

};

_3d _3d::operator + (_3d b)

{

 _3d c;

 c.x = x + b.x;

 c.y = y + b.y;



 c.z = z + b.z;

 return c;

}

Обратите внимание на то, где мы описываем тело того или иного метода. Методы mod() и protection() описаны вместе со своими телами непосредственно внутри структуры. Но можно поступить иначе: поместить прототипы метода внутрь структуры, а определение тела функции - вне структуры, как мы поступили с оператором "+".

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

Кроме представленного выше способа создания встраиваемых функций (записать тело метода непосредственно в структуре), есть еще один способ - вставить спецификатор inline перед определением метода:

inline _3d _3d::operator + (_3d b)

{

 _3d c;

 c.x = x + b.x;

 c.y = y + b.y;

 c.z = z + b.z;

 return c;

}

Теперь оператор "+" станет встраиваемой функцией.

Встраиваемые функции действуют почти так же, как и макроопределения с параметрами, но имеют перед последними ряд преимуществ. Во-первых, inline методы обеспечивают более стройный способ встраивания в программу короткой функции. Во-вторых, компилятор С++ гораздо лучше работает со встраиваемыми функциями, чем с макроопределениями.

Важно понимать, что inlineне является командой для компилятора, это скорее просьба сделать метод встраиваемым. Если по каким-то причинам (например, при наличии в теле функции операторов цикла, switch или goto) компилятор не выполнит запрос, то функция будет откомпилирована как невстраиваемая.



Содержание раздела