Встроенные функции в C++

Побитовые операторы в C++ Программирование и разработка

Когда в C ++ вызывается обычная функция, некоторые из них подслушиваются только за вызов функции. Фактически, для вызова функции требуется время, прежде чем она действительно начнет выполняться. Это время между вызовом функции и ее фактическим запуском называется временем переключения. Если обычная функция велика, то есть ее выполнение займет много времени, тогда время переключения относительно невелико, и пользователь может его игнорировать. Однако, если обычная функция мала, как и многие функции, то время переключения, примерно одинаковое для больших и малых функций, не следует игнорировать. Во многих ситуациях время переключения больше, чем время, необходимое для реального выполнения небольшой функции; в некоторых случаях намного дольше.

Для решения этой проблемы C ++ использует макрос и встроенную функцию. Макрос похож на небольшую функцию, но обычно он короче типичной небольшой функции. Самый длинный макрос — это одно «утверждение». В теле функции может быть несколько операторов. Небольшая встроенная функция имеет преимущества перед обычной небольшой функцией.

Когда макрос определен, он вызывается позже в программе. Встроенная функция также определяется, а затем вызывается позже в программе. Обычная функция определяется, а затем вызывается позже в программе. Все эти три типа определены и вызываются позже в программе. Любой из них может быть вызван более одного раза.

Макро- и небольшие встроенные функции отличаются от нормальной функции подхода, когда они позже отключаются в программе. Компилятор C ++ размещает определенный код макроса или определенный небольшой встроенный код функции (тело) везде, где он вызывается в программе. Когда компилятор делает это, считается, что компилятор расширил макрос или встроенную функцию. Это не относится к нормальному функционированию. Обычная функция не раскрывается там, где она вызывается.

Хотя для вызова нормальной функции требуется время переключения, для того, чтобы функция была правильно утверждена перед ее выполнением, макрос или небольшая встроенная функция начинает выполнение всякий раз, когда она вызывается, и нет потери времени переключения. Это главное преимущество макроса и небольшой встроенной функции по сравнению с обычной функцией, т. Е. Время переключения не учитывается.

В этой статье объясняется сравнение встроенных функций в C ++ с макросами. Дается объяснение макроса. Сравнение встроенной функции и нормальной функции проводится в конце статьи.

Читайте также:  Объем переменных/методов в Java

Примечание. Вызов макроса в программе называется вызовом макроса.

Определение макросов и встроенных функций

Макрос, подобный объекту, и встроенная переменная.
Существует макрос, подобный объекту, и макрос, подобный функции. Соответственно, есть встроенные переменные и встроенные функции. Рассмотрим следующую программу на C ++:

#include
using namespace std;

#define var1 «E»

inline char var2 = ‘E’;

int main()
{
cout << var1 << endl;
cout << var2 << endl;

return 0;
}

Результат:

E
E

Эта программа имеет объектно-подобный макрос и встроенную переменную. Каждый содержит значение «E». Макрос, подобный объекту, начинается с #define и не имеет индикатора типа. Встроенная переменная начинается со слова «встроенная», а за ней следует индикатор типа. У макросов есть недостаток по сравнению со встроенными типами, поскольку они не указывают тип. Это может привести к проблемам с несоответствием типов в программе. В функции main () var1 и var2 — это код определения различных переменных соответственно.

Примечание: неясно, содержит ли var1 символ или буквальную строку. Также обратите внимание, что макрос, как объектный, так и функциональный, не заканчивается точкой с запятой. Он заканчивается нажатием клавиши Enter. Встроенная переменная или встроенная функция заканчиваются своим обычным образом.

Функционально-подобный макрос и встроенная функция

Функциональный макрос — это макрос, который принимает аргументы. Подобно объектно-подобному макросу, везде, где функциональный макрос вызывается в программе, компилятор заменяет вызов определением кода и устраняет время переключения (накладные расходы на вызов функции) во время выполнения.

Встроенная функция — это функция, которая начинается со слова «встроенная». Он имеет преимущество перед функционально-подобным макросом с его типом возвращаемого значения и типами аргументов. Макрос, подобный функции, не имеет типов аргументов или возвращаемых типов. Его возвращаемый тип — это последнее значение имени макроса.

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

#include
using namespace std;

#define maxM(a, b) ((a) > (b) ? (a): (b))

inline int maxI(int a, int b) {
if (> b)
return a;
if (< b)
return b;
if (== b)
return a;
}

int main()
{
cout << maxM(2.56) << endl;
cout << maxI(37) << endl;

return 0;
}

Результат:

6
7

В макросе аргументы должны быть совместимого типа. Это дает макросу своего рода преимущество перед встроенной функцией, типы аргументов которой в этом случае должны быть одинаковыми.

Имя макроса — maxM. Аргументы — а и б. Остальное — это своего рода тело функции, ограниченное круглыми скобками. Он говорит, что если (a)> (b) истинно, то a становится значением макроса; в противном случае b становится значением макроса.

Встроенная функция и компилятор

После того, как компилятор заменяет встроенный вызов функции кодом определения функции, программа все равно должна выполняться. Компиляция не выполняется или не выполняется программа. При нормальной функции накладные расходы (время переключения) возникают, когда программа запускается (выполняется). Макро- или встроенная замена происходит во время компиляции, то есть перед выполнением (перед отправкой программы заказчику или пользователю).

В конце концов, время переключения опускается или увеличивается для макросов и небольших встроенных функций. Однако, если встроенная функция велика, компилятор решит, объявить ли функцию встроенной, встроенной или нет. Если функция, объявленная как встроенная, имеет большой размер, замена любого из ее вызовов телом кода функции может не принести существенного выигрыша. О критериях решения компилятора — см. Ниже.

Примечание. Функция, определенная в определении класса, является встроенной функцией, которой предшествует встроенный спецификатор.

Сравнение макросов и встроенных функций

Макрос может работать с разными типами, если они совместимы. Это преимущество. Однако это также приводит к побочным эффектам, что в свою очередь делает его недостатком. Встроенная функция проверяет допустимость своих типов аргументов перед использованием аргументов, что предотвращает побочные эффекты.

Сравнение встроенных и обычных функций

Преимущества встроенной функции

  • Нет накладных расходов на вызов функций (нет времени переключения).
  • При возврате из нормальной функции возникают также накладные расходы. При использовании встроенной функции накладные расходы на обратный вызов отсутствуют.
  • Возможна контекстно-зависимая оптимизация тела функции с помощью встроенной функции.

Недостатки встроенной функции

  • Для каждого вызова встроенной функции код определения функции (тела) повторяется (был повторно набран компилятором). Это может привести к получению очень большого двоичного (скомпилированного) файла.
  • Компилятору требуется много времени для компиляции, поскольку он повторяет один и тот же код для всех вызовов.

Встроенные функции могут не понадобиться для многих встроенных систем, потому что меньший размер программы предпочтительнее более высокой скорости.

Заключение

Встроенная функция похожа на макрос. Они служат той же цели. Код определения заменяет каждый вызов или вызов функции. Однако встроенная функция имеет больше преимуществ перед макросом. Есть объектный макрос и, соответственно, встроенная переменная. Есть макрос, подобный функции, и, соответственно, встроенная функция. Функция, определенная в определении класса, является встроенной функцией, независимо от того, предшествует ли ей встроенный спецификатор или нет.

Чтобы определить макрос, подобный объекту, или макрос, подобный функции, поставьте перед ним #define, за которым следует имя макроса. Макрос не указывает тип значения или типы аргументов. Чтобы определить встроенную переменную или встроенную функцию, поставьте перед ней спецификатор inline, за которым следует тип возвращаемого значения, а затем имя. Для встроенной функции как возвращаемый тип, так и типы аргументов являются точными. Побочные эффекты предотвращены.

Встроенная функция имеет общие преимущества перед макросом. Когда встроенная функция сравнивается с нормальной функцией, есть свои плюсы и минусы.

Оцените статью
bestprogrammer.ru
Добавить комментарий