68942

Inline функції

Лекция

Информатика, кибернетика и программирование

Визначення функцій що підставляються усередині класу Мова C володіє важливою властивістю: у нім існують функції inline functions що підставляються які широко використовуються в класах. Щоб замінити виклик функції підстановкою перед її визначенням слід вказати слово inline.

Украинкский

2014-09-27

36.5 KB

0 чел.

Лекція № 4

Тема: Inline функції

План:

  1.  Inline функції

2. Визначення функцій, що підставляються, усередині класу

 

Мова C++ володіє важливою властивістю: у нім існують функції (inline functions), що підставляються, які широко використовуються в класах. Можна написати коротку функцію, яка не викликається, а підставляється у відповідне місце програми. Цей процес нагадує функціональну макропідстановку. Щоб замінити виклик функції підстановкою, перед її визначенням слід вказати слово inline. Наприклад, в наступній програмі функція мах () не викликається, а підставляється.

#include <iostream>

using namespace std;

inline int max(int а, int b)

{

return a>b ? а : b;

}

int main() {

cout « max(10, 20);

cout « " " « max(99, 88);

return 0;

}

З погляду компілятора ця програма виглядає так.

include <iostream>

using namespace std;

 

int main() {

cout « (10>20 ? 10 : 20);

cout « " " « (99>88 ? 99 : 88);

return 0;

}

Функції, що підставляються, дозволяють створювати дуже ефективні програми. Оскільки класи зазвичай містять декілька інтерфейсних функцій, які часто викликаються для доступу до його закритих членів, необхідно, щоб ці функції виконувалися щонайшвидше. Як відомо, кожен виклик функції зв'язаний з додатковими витратами на передачу і повернення управління. Зазвичай при виклику функції її аргументи заштовхуються в стек, а вміст регістрів копіюється в оперативну пам'ять, щоб після повернення управління можна було відновити первинний стан програми. На ці операції витрачається додатковий час. Проте, якщо замість виклику тіло функції просто підставляється в програму, нічого цього не вимагається. На жаль, прискорення роботи програми досягається за рахунок збільшення розміру коду, оскільки тіло функції, що підставляється, дублюється кілька разів. Функції, що з цієї причини підставляються, повинні бути дуже маленькими. Крім того, підставляються слід робити тільки ті функції, швидкодія яких дійсно істотно впливає на ефективність програми.

Як і специфікатор register, ключове слово inline є лише рекомендацією, а не наказом компілятору. В деяких випадках компілятор може його проігнорувати. Крім того, деякі компілятори обмежують категорії функцій, які можуть бути такими, що підставляються. Зокрема, як правило, компілятори не дозволяють підставляти рекурсивні функції. У кожному конкретному випадку інформацію про обмеження на застосування функцій, що підставляються, слід шукати в документації, супроводжуючій компілятор. Врахуйте, якщо функцію не можна підставити, вона викликатиметься.

Функції, що підставляються, можуть бути членами класу. Наприклад, наступна програма вважається цілком коректною.

#include <iostream>

using namespace std;

class myclass {

int а, b; public:

void init(int i, int j);

void show();

};

// Створити функцію, що підставляється,

inline void myclass::init(int i, int j)

{

а = i;

b = j;

}

// Створити іншу функцію, що підставляється.

inline void myclass::show()

{

cout « а « " " « b « "\n";

}

 

int main() {

myclass x;

x.initdO, 20); x.show();

return 0;

}

Ключове слово inline не є частиною мови С. Отже, воно не визначене в стандарті С89, але включене в стандарт С99.

Визначення функцій, що підставляються, усередині класу

Коротку функцію можна визначити безпосередньо усередині оголошення класу. Якщо функція визначена усередині оголошення класу, вона автоматично перетворюється на ту, що підставляється (якщо це не перечить обмеженням компілятора). Указувати при цьому ключове слово inline абсолютно не обов'язково, хоча помилкою це не вважається. Наприклад, попередню програму можна переписати, помістивши визначення функцій init() і show() у оголошення класу myclass.

#include <iostream>

using namespace std;

class myclass {

int а, b; public:

// Автоматична підстановка

void init(int i, int j) { a=i; b=j; }

void show() { cout « а « " " « b « "\n"; }

};

int main() {

myclass x;

x.initdO, 20);

x.show();

return 0;

}

Зверніть увагу на спосіб запису тіла функції усередині оголошення класу myclass. Оскільки функції, що підставляються, зазвичай короткі, такий прийом цілком типовий. Проте абсолютно необов'язково записувати функції саме так. Наприклад, оголошення функції myclass можна переписати інакше.

include <iostream>

using namespace std;

class myclass {

int а, b; public:

// Автоматична підстановка

void init(int i, int j)

{

а  =   i; b  =   j; }

void show() {

cout <<  а <<   "   "   << b «   "\n";

}

};

З технічної точки зору підстановка функції show() не має сенсу, оскільки час, що витрачається на уведення-виведення, набагато перевищує час, необхідний для виклику функції. Проте переважна більшість програмістів вважають за краще поміщати всі короткі функції-члени усередині оголошення класу. (Украй рідко в професійних програмах можна зустріти короткі функції-члени, визначені зовні оголошення класу.)

Конструктор і деструкція можуть бути такими, що підставляються або за умовчанням, якщо вони визначені усередині оголошення класу, або явно.


 

А также другие работы, которые могут Вас заинтересовать

31345. ГЕНЕЗИС И ЭВОЛЮЦИЯ СОЛЯРНЫХ АСПЕКТОВ МИФОЛОГИИ АПОЛЛОНА 9.61 MB
  Лосев писал что широкая публика а значительной мере также и наука отождествляет Аполлона и Солнце1. Цель предлагаемой им реконструкции состоит в том чтобы дать правдоподобное объяснение известному и довольно странному факту: по сравнению с восточными религиозными системами в Греции в историческую эпоху культ Солнца как и других астральных божеств был очень мало развит. Рапп объясняет это тем что известный нам греческий Гелиос был последним звеном цепи развития мифологических представлений и именно поэтому сохранил в своей мифологии...
31346. МЕТАФИЗИКА КУЛЬТУРЫ. ОПЫТ СИСТЕМАТИЗАЦИИ ИДЕЙ РУССКИХ РЕЛИГИОЗНЫХ МЫСЛИТЕЛЕЙ 9.52 MB
  Духовная скудость текущей повседневности российского социума ужасает. Сейчас уже мало кто сомневается в бесперспективности новейшего российского либерализма. Дело не только в его роковой беспочвенности, в отрыве от национальных культурно-исторических корней, но и в каком-то совершенно немыслимом ранее «либеральном варварстве», выражающемся и в переходе от преклонения перед Западом к расовой ненависти к Востоку
31347. Образ птицы Бену в контексте древнеегипетской религии и мифологии 3.8 MB
  Важность специального исследования образа Бену обусловлена не только стремлением подробнее осветить его значение, но, и уходит гораздо глубже. На наш взгляд, объяснив закономерности развития и функционирования этого образа в системе древнеегипетских религиозно-мифологических представлений, мы во многом приблизимся к решению проблем, касающихся некоторых аспектов культа животных; и шире, к выявлению закономерностей мифотворчества в древнем Египте.
31348. ЭКРАННАЯ КУЛЬТУРА КАК НОВАЯ МИФОЛОГИЯ (НА ПРИМЕРЕ КИНО) 6.3 MB
  Экранная культура: основные понятия история развития и специфика современного состояния Понятие экранной культуры и основные этапы ее развития Экранная культура и современное коммуникативное пространство Экранная культура в контексте средств массовой коммуникации. Мифы в экранной культуре: традиции и современность Понятие мифа применительно к экранной культуре Новая мифология как способ...
31349. Фантастика и миф : использование мифологических образов в современной фантастической литературе 571.13 KB
  Тем не менее мы видим здесь не хронику давно забытых событий а историю о подлой неблагодарности королей об интриганахпридворных о законниках выворачивающих истину наизнанку чтобы отправить на тот свет неугодного им человека. И теперь перед нами возникает следующий не менее интересный вопрос: зачем же понадобилось невероятное в романе изображающем человека Всем известно что Свифт не единственный писатель который вводил в свои произведения фантастические образы. Вспомним лермонтовского Демона пушкинскую Русалку в повести Гоголя...
31350. РАЗВИТИЕ ИССЛЕДОВАТЕЛЬСКОЙ ИНИЦИАТИВНОСТИ В ДЕТСКОМ ВОЗРАСТЕ 9.73 MB
  Структура и функции исследовательской инициативности в деятельности человека . Психологические исследования деятельности человека по изучению сложных многосвязных объектов . В настоящее время развитие общества характеризуется все возрастающей динамичностью проникновением на новые уровни познания природы изменением социального устройства и возникновением качественно новых видов деятельности в ранее неизвестных областях. Особое значение здесь приобретает стремление и способность личности активно исследовать новизну и сложность меняющегося...
31351. КОММУНИКАТИВНЫЕ СТРАТЕГИИ И ТАКТИКИ АГИТАЦИОННОГО ТЕКСТА И ИХ СТИЛИСТИЧЕСКАЯ РЕПРЕЗЕНТАЦИЯ 850 KB
  Формирование в стране новой коммуникационной среды, новых форм коммуникационного обмена, становление системы активных публичных коммуникаций обусловило актуальность социопрагматического аспекта анализа феноменов вербальной коммуникации. По выражению О.С. Иссерс, «в сегодняшнем обществе сформировался социальный заказ на знание закономерностей общения»
31352. Параметрические модели популяционной динамики и их приложение к задачам демографии 6.7 MB
  Приближение стабильного населения и решение уравнения Лотки. Макроэкономическая модель устойчивого развития населения. В настоящей диссертационной работе проведена систематизация и предпринята попытка развития параметрических методов моделирования динамики численности популяций и в частности населения вводится понятие информационного параметра как отличительной черты цивилизованного общества от биологической популяции и рассматривается его участие в демографических процессах. В работе уделено особое внимание параметрическому...