Рекомендуем, 2024

Выбор редакции

Разница между встроенным и макросом в C ++

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

Давайте изучим разницу между inline и макросом с помощью сравнительного графика.

Сравнительная таблица

Основа для сравненияВ соответствиимакрос
основнойВстроенные функции анализируются компилятором.Макросы расширяются препроцессором.
Синтаксисinline return_type funct_name (параметры) {., , }#define macro_name char_sequence
Используемые ключевые словав соответствии
#define
определенныйЭто может быть определено внутри или вне класса.Он всегда определяется в начале программы.
оценкаОн оценивает аргумент только один раз.Он оценивает аргумент каждый раз, когда он используется в коде.
расширениеКомпилятор не может быть встроенным и расширять все функции.Макросы всегда расширяются.
автоматизацияКороткие функции, определенные внутри класса, автоматически превращаются в встроенные функции.Макросы должны быть определены специально.
Доступ кВстроенная функция-член может получить доступ к данным-членам класса.Макросы никогда не могут быть членами класса и не могут получить доступ к данным членов класса.
прекращениеОпределение встроенной функции заканчивается фигурными скобками в конце встроенной функции.Определение макроса заканчивается новой строкой.
отладкаОтладка проста для встроенной функции, поскольку проверка ошибок выполняется во время компиляции.Отладка становится трудной для макросов, поскольку проверка ошибок не происходит во время компиляции.
переплетВстроенная функция очень хорошо связывает все операторы в теле функции, так как тело функции начинается и заканчивается фигурными скобками.Макрос сталкивается с проблемой связывания, если он имеет более одного оператора, так как у него нет символа завершения.

Определение Inline

Встроенная функция выглядит как обычная функция, но ей предшествует ключевое слово « inline ». Встроенные функции - это короткие функции, которые раскрываются в точке их вызова вместо вызова. Давайте разберем встроенные функции на примере.

 #include использование пространства имен std; пример класса {int a, b; public: inline void initialize (int x, int y) {a = x; b = y} void display () {cout << a << "" < 

В приведенной выше программе я объявил и определил функцию initialization () как встроенную функцию в классе «example». Код функции initialization () расширится там, где он вызывается объектом класса «example». Функция display (), определенная в примере класса, не объявлена ​​inline, но может считаться встроенной компилятором, так как в C ++ функция, определенная внутри класса, автоматически становится встроенной компилятором с учетом длины функции.

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

Определение макроса

Макрос - это «директива препроцессора». Перед компиляцией программа проверяется препроцессором, и, где бы он ни находил макрос в программе, он заменяет этот макрос своим определением. Следовательно, макрос рассматривается как «замена текста». Давайте изучим макрос на примере.

 #include #define GREATER (a, b) ((a <b)? b: a) int main (void) {cout << "Большее из 10 и 20 равно" << GREATER ("20", "10") << "\ n"; вернуть 0; } 

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

  • Макросы всегда определяются заглавными буквами, чтобы программистам было легче идентифицировать все макросы в программе во время чтения.
  • Макрос никогда не может быть функцией-членом класса, и он не может получить доступ к элементам данных любого класса.
  • Функция макроса оценивает аргумент каждый раз, когда он появляется в своем определении, что приводит к неожиданному результату.
  • Макрос должен быть меньшего размера, так как большие макросы будут излишне увеличивать размер кода.

Ключевые различия между Inline и Macro

  1. Основное различие между встроенными и макросами заключается в том, что встроенные функции анализируются компилятором, тогда как макросы в программе расширяются препроцессором.
  2. Ключевое слово, используемое для определения встроенной функции, - « inline », тогда как ключевое слово, используемое для определения макроса, - « #define ».
  3. Если встроенная функция декальрна внутри класса, она может быть определена либо внутри класса, либо вне класса. С другой стороны, макрос всегда определяется в начале программы.
  4. Аргумент, передаваемый встроенным функциям, оценивается только один раз во время компиляции, тогда как аргумент макроса вычисляется каждый раз, когда макрос используется в коде.
  5. Компилятор не может встроить и расширять все функции, определенные внутри класса. С другой стороны, макросы всегда расширяются.
  6. Короткие функции, которые определены внутри класса без встроенного ключевого слова, автоматически становятся встроенными функциями. С другой стороны, макрос должен быть определен специально.
  7. Встроенная функция может получить доступ к членам класса, тогда как макрос никогда не сможет получить доступ к членам класса.
  8. Для завершения встроенной функции необходима закрытая фигурная скобка, тогда как макрос завершается с началом новой строки.
  9. Отладка упрощается для функции inlne, так как она проверяется во время компиляции на наличие ошибок. С другой стороны, макрос не проверяется во время компиляции, поэтому отладка макроса становится сложной.
  10. Будучи функцией, встроенная функция связывает своих членов в стартовой и закрытой фигурных скобках. С другой стороны, у макроса нет символа завершения, поэтому связывание становится трудным, когда макрос содержит более одного оператора.

Выводы:

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

Top