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

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


 

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

22235. Дифференциальный криптанализ 528 KB
  Для DESподобных криптосистем различие выбирается как побитовая сумма по модулю два XOR значений двух текстов в модульной арифметике  разность пары текстов. Эта операция в дальнейшем для краткости будет обозначаться аббревиатурой из английских букв  XOR2. Данное фиксированное значение XOR входной пары правых полу блоков для F функции легко определяет свое XOR значение после расширения по формуле: EXEX = EXX. XOR с ключом не изменяет значение XOR в паре т.
22236. Введение в дифференциальный криптанализ 741 KB
  Будем говорить что X может вызвать Y с вероятностью p для F функции если p есть доля всех возможных входных пар зашифрованных всеми возможными значениями подключа в которых входной XOR F функции равен X а выходной XOR равен Y. Если в DES X  Y X переходит в Y с вероятностью p для F функции то каждая фиксированная входная пара Z Z с Z = ZZ= X образует выходной XOR F функции равный Y с той же самой долей p возможных значений подключа. Очевидно что для каждого входного XOR имеем = независимо от ключа KS. Если имеется k входных пар...
22237. Введение в дифференциальный криптанализ. Итеративные характеристики 401.5 KB
  Статистическое поведение большинства характеристик не позволяет нам искать пересечение всех ключей предложенных поддерживаемых различными парами как это мы делали в примере 6 Л2 так как пересечение обычно пустое: неправильные пары не обязательно указывают на правильный ключ как возможное значение. Однако мы знаем что правильное ключевое значение должно быть результатом всех правильных пар которые встречаются приблизительно с характеристической вероятностью с вероятностью характеристики. Все другие возможные ключевые значения...
22238. Атака на DES уменьшенный до восьми циклов 414 KB
  Введение в дифференциальный криптанализ 1 Атака на DES уменьшенный до восьми циклов Чтобы найти другие биты Эли Бихам и Ади Шамир фильтруют все пары и оставляют только те которые имеют ожидаемое значение используя при этом известные значения h и значения ключевых битов K8 входящих в S6 S7 и S8. Ожидаемое число остающихся пар есть 53. Они применяют аналогичный метод счета используя увеличенное отношение S N созданное большой концентрацией правильных пар и затем снова фильтруют пары. Неправильная пара не отвергается этим или...
22239. Введение в дифференциальный криптанализ 626 KB
  Анализ требований к отбору S блоков разработчиков стандарта. В этом разделе мы хотим высказать свою версию обоснования требований к отбору S блоков выдвинутых разработчиками стандарта. Критерии отбора S блоков: 1. Если два входа S блока отличаются своими первыми двумя битами и имеют совпадающими 2 последних бита то выходные биты не должны быть теми же самыми  для любых e и f; Для любых ненулевых 6ти битовых различий между входами не более чем 8 из 32 пар входов могут показывать одни и те же выходные различия; Критерий подобный...
22240. Способ равных допусков 47 KB
  На размеры всех составляющих звеньев кроме увязочного назначается допуски из одного квалитета с учетом номинального размера звена. Вероятностный метод допусков расчета составляющих звеньев. допустить выбор подбор или изменение величины некоторых звеньев цепи от можно расширить в несколько раз допуски звеньев и соответственно снизить затраты за счет непринятия в расчет маловероятностных комбинаций числовых значений тех же звеньев цепи. Для вероятностного расчета допусков нужно располагать информацией о предполагаемых законах распределения...
22241. Отклонение формы и расположения 938 KB
  В основе нормирования и отсчетов отклонения формы и расположения поверхностей заложен принцип прилегающих поверхностей и профилей. База – это есть элемент детали определяющий одну из плоскостей или осей системы координат по отношению к которой задается допуск расположения или определяется отклонение рассматриваемого элемента. Все отклонения и допуски подразделяются на 3 группы: отклонение формы; отклонение расположения; суммарное отклонение.
22242. Допуски и посадки подшипников качения 197 KB
  Присоединительными поверхностями подшипника качения являются наружный Диаметр D наружной поверхности подшипника и внутренний диаметр d внутреннего кольца подшипника а также ширина В колец. Таким образом за номинальные диаметры подшипника принимаются диаметры его посадочных поверхностей D и d. Основная присоединительная поверхность подшипников качения по которым они монтируются на валах и корпусах машин это отверстие во внутреннем кольце подшипника и наружная поверхность наружного кольца подшипника. Посадки подшипников на вал выполняются...
22243. Меры повышения долговечности калибра 81 KB
  К наборам прилагают аттестаты в которых указаны номинальные размеры плиток отклонения от номинальных размеров разряд набора и средства измерения использованные при аттестации набора. К третьим относятся средства измерения наружных и внутренних диаметров. Наружные если малые диаметры контролируются с помощью рычажнозубчатых индикаторов типа РЗИ с ценой деления 2 и 5 мкм предел измерения от 1 до 3 мм. К ним относятся штангенциркули для измерения до 2 мм штангенглубомеры для пазов штангенрейсмусы – это средства для осуществления и...