
- •1.K&r c. Ansi c и iso c. Стандарт c99
- •Структура компилятора
- •3.Проблемы использования языка Си.
- •5.Числовые константы. Символические константы.
- •6.Идентификаторы. Константные переменные. Основные типы.
- •7.Указатели. Ссылки. Изменение типа данных.
- •8.Одномерные массивы. Символьные массивы.
- •9.Многомерные массивы.
- •10.Структуры.
- •11.Ключевое слово union.
- •12.Переименование типов (typedef).
- •13.Выражения.
- •14.Арифметические операции. Логические операции.
- •15.Операции присвоения.
- •16.Операции отношения. Адресные операции.
- •Адресные операции
- •17.Операции “?:”, sizeof, (тип)
- •18.Составной оператор. Оператор-выражение.
- •19.Условный оператор if. Оператор-переключатель switch. Условный оператор if
- •If (условие) оператор_1; else оператор_2;
- •If (условие) { оператор_1; оператор_2; … }
- •Оператор варианта switch
- •20.Операторы циклов while и do-while.
- •21.Оператор цикла for. Оператор продолжения continue.
- •22.Определение функции. Оператор возврата return. Вызов функции.
- •23.Функция main.
- •24.Поименованные константы и замена идентификаторов. Макросы.
- •If (выражение)
- •25.Включение файлов. Условная компиляция. Включение файла
- •26.Команда error. Команда pragma.
- •27.Обработка особых ситуаций. Обработка try, перехват catch, Спецификация особой ситуации throw.
- •28.Функции-подстановки (inline).
- •29.Операция создания объекта new. Операция delete. Операция new
- •Операция delete
- •30.Инкапсуляция. Наследование.
- •31.Полиморфизм.
- •32.Классы. Члены класса.
- •33.Конструктор. Деструктор. Функции-члены.
- •34.Операция доступа к области видимости “::”. Указатель this.
28.Функции-подстановки (inline).
В C++ можно задать функцию, которая на самом деле не вызывается, а ее тело встраивается в программу в месте ее вызова. Итак, inline-функция — это такая функция, чье тело подставляется в каждую точку вызова, вместо того, чтобы генерировать код вызова.
Общая форма объявления inline-функции следующая:
inline объявление_функции
Модификатор inline предшествует всем частям объявления функции.
Причина использования inline-функции заключается в их эффективности. Всякий раз, когда вызывается функция, необходимо выполнить серию инструкций для формирования вызова функции, вставки аргументов в стек и возврата значения из функции. В некоторых случаях для этого приходится использовать много тактов центрального процессора. При использовании inline-функции нет необходимости в таких дополнительных действиях и скорость выполнения программы возрастает.
Важно ясно понимать, что технически inline представляет запрос к компилятору сгенерировать подставляемый код, inline не является командой. В некоторых ситуациях компилятор не будет выполнять этот запрос. Например, некоторые компиляторы не подставляют функции, содержащие циклы, switch и операторы goto. Borland С не подставляет функции, использующие исключения или имеющие в качестве параметра объект, содержащий деструктор. Он также не подставляет функций, возвращающих объекты, имеющие деструкторы.
Однако в тех случаях, когда размер inline-функции достаточно большой, общий объем программы также возрастает. Поэтому в качестве inline-функции обычно используются очень маленькие функции. Большие функции реализуются обычным способом.
// Пример встраиваемой функции
#include <iostream>
using namespace std;
inline int even(int x)
{
return ! (x%2) ;
}
int main()
{
if (even(10) ) cout « "10 является четным\n";
if (even(11) ) cout « "11 является четным\n";
return 0;
}
В этом примере функция even(), которая возвращает истину при четном
аргументе, объявлена встраиваемой. Это означает, что строка
if (even(10)) cout « "10 является четным\n";
функционально идентична строке
if ( ! (10%2) ) cout « "10 является четным\n";
Этот пример указывает также на другую важную особенность использования встраиваемой функции: она должна быть задана до ее первого вызова. Если это не так, компилятор не будет знать, какой именно код предполагается встроить в программу с помощью встраиваемой функции. Поэтому функция even() была определена перед функцией main().
В пользу использования встраиваемых функций вместо макроопределений с параметрами имеется два довода. Во-первых, они обеспечивают более стройный способ встраивания в программу коротких фрагментов кода. На пример, при создании макроса с параметрами легко забыть, что для гарантии правильности встраивания в каждом случае часто требуются круглые внешние скобки. Встраиваемая функция исключает эту проблему. Во-вторых, компилятор гораздо лучше работает со встраиваемой функцией, чем с макрорасширением. Как правило, программисты C++ для многократных вызовов коротких функций вместо макросов с параметрами практически всегда используют встраиваемые функции.