Давайте изучим разницу между 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
- Основное различие между встроенными и макросами заключается в том, что встроенные функции анализируются компилятором, тогда как макросы в программе расширяются препроцессором.
- Ключевое слово, используемое для определения встроенной функции, - « inline », тогда как ключевое слово, используемое для определения макроса, - « #define ».
- Если встроенная функция декальрна внутри класса, она может быть определена либо внутри класса, либо вне класса. С другой стороны, макрос всегда определяется в начале программы.
- Аргумент, передаваемый встроенным функциям, оценивается только один раз во время компиляции, тогда как аргумент макроса вычисляется каждый раз, когда макрос используется в коде.
- Компилятор не может встроить и расширять все функции, определенные внутри класса. С другой стороны, макросы всегда расширяются.
- Короткие функции, которые определены внутри класса без встроенного ключевого слова, автоматически становятся встроенными функциями. С другой стороны, макрос должен быть определен специально.
- Встроенная функция может получить доступ к членам класса, тогда как макрос никогда не сможет получить доступ к членам класса.
- Для завершения встроенной функции необходима закрытая фигурная скобка, тогда как макрос завершается с началом новой строки.
- Отладка упрощается для функции inlne, так как она проверяется во время компиляции на наличие ошибок. С другой стороны, макрос не проверяется во время компиляции, поэтому отладка макроса становится сложной.
- Будучи функцией, встроенная функция связывает своих членов в стартовой и закрытой фигурных скобках. С другой стороны, у макроса нет символа завершения, поэтому связывание становится трудным, когда макрос содержит более одного оператора.
Выводы:
Встроенные функции гораздо более убедительны, чем макрофункции. C ++ также предоставляет лучший способ определения константы, который использует ключевое слово «const».