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

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


 

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

38026. Элементарные таблицы 60 KB
  Если значение ноль то рамка не требуется; cellpdding= cellspcing= добавляют свободное пространство между данными ячейки и ее границами и между ячейками таблицы соответственно. th т th контейнер ячейки Заголовок : заголовок столбца или строки. Значения: left заголовок прижать к левому краю ячейки center заголовок расположить по центру ячейки right заголовок прижать к правому краю ячейки; vlign= задает положение данных в ячейке Заголовок по вертикали. Значения: bottom заголовок прижать к нижнему краю ячейки middle заголовок...
38027. Продолжение разговора о ссылках 63.5 KB
  Способ первый с помощью атрибута nme имя закладки тэга : Заголовки стих первый стих второй стих третий в нашем примере мы сделали закладками использовав атрибут тэга nme: Заметьте href= stih3 символ решетки перед именем закладки на которую мы ссылаемся обязателен.
38028. Создание форм 45.5 KB
  Помимо атрибута type большинство элементов управления требуют указания атрибутов nme и vlue для идентификации имени и исходного значения если таковое имеется. Вот пример кода создающего текстовое поле: input type=â€text†nme=â€usernme†vlue=â€â€ Этот код может пригодиться при создании текстового поля для ввода имени пользователя при подключении к Webузлу. Для полноты картины можно дополнить его полем пароля: input type=â€pssword†nme =“userpss†vlue=â€â€ обратите внимание что атрибуту vlue в обоих случаях присвоено...
38029. Создание фреймов 729 KB
  HTML программа имеющая структуру кадров не должна содержать контейнеры body и наоборот. Обычно это файл HTML программы из того же каталога папки что и сам контейнер но может быть и абсолютный адрес файла с любого компьютера. nofrmes т nofrmes контейнер HTML текста для броузеров которые не поддерживают аппарат кадров. Левый фрейм Верхний правый фрейм Нижний правый фрейм Листинг: главный файл html hed title фреймы title hed frmeset cols= 4 frme frmeborder=yes src= left.
38030. Каскадные таблицы стилей 63.5 KB
  Каскадные таблицы стилей Основным понятием CSS является стиль т. CSS действует другим более удобным и экономичным способом. Кроме того CSS позволяет работать со шрифтовым оформлением страниц на гораздо более высоком уровне чем стандартный HTML избегая излишнего утяжеления страниц графикой. Практическое освоение CSS Как вам уже известно информация о стилях может располагаться либо в отдельном файле либо непосредственно в коде Webстранички.
38032. Структура HTML-документа. Создание элементарной WEB-страницы 502 KB
  Для работы с этими текстами был создан специальный протокол HTTP Hyper Text Trnsfer Protocol были обозначены основные элементы языка разметки HTML. Язык HTML развился из стандартного обобщенного языка описания документов SGML и является его производной созданной для разметки текстовых документов. Существуют разные суждения о том считать HTML языком программирования или нет. С точки зрения программистов он имеет достаточно простой синтаксис и довольно легок в изучении но с другой стороны для простого пользователя иногда постижение...
38033. Форматирование текста 44.5 KB
  Форматирование текста Цель работы: используя теги разбивки текста логического и физического форматирования текста создать страницу по данному образцу. Теги разбивки текста h1 т h1 h2 т h2 h3 т h3 h4 т h4 h5 т h5 h6 т h6 заголовки стилей 1 2 3 4 5 6. Атрибут: lign= задает положение текста абзаца на строке. Значения: left выровнять текст по левому краю center выровнять текст по центру right выровнять текст по правому краю.
38034. Работа с цветом фона страницы и цветом шрифта. Задание бегущей строки 159.5 KB
  Работа с цветом фона страницы и цветом шрифта. Контейнер описания шрифта может быть помещен в любой другой контейнер. задает имя шрифта или несколько возможных шрифтов. Броузер берет последующий шрифт если у него нет предыдущего; size= задает размер шрифта.