Разлика между Inline и Macro в C ++

Автор: Laura McKinney
Дата На Създаване: 2 Април 2021
Дата На Актуализиране: 15 Може 2024
Anonim
P.15 Макросы и inline-функции в  C и C++
Видео: P.15 Макросы и inline-функции в C и C++

Съдържание


Макрос е инструкция, която се разширява в момента на нейното извикване. Функциите също могат да бъдат дефинирани, като макроси. По подобен начин вградените функции също се разширяват в точката на неговото извикване. Една от основните разлики между вградена и макро функция е, че вградени функции се разширяват по време на компилация, и на макроси се разширяват, когато програмата се обработва от предпроцесорни.

Нека да проучим разликата между вграден и макрос с помощта на сравнителна диаграма.

  1. Сравнителна диаграма
  2. дефиниция
  3. Ключови разлики
  4. заключение

Сравнителна диаграма

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


Дефиниция на Inline

Вградена функция изглежда като обикновена функция, но е предшествана от ключовата дума „в редица". Вградените функции са функции с къса дължина, които се разширяват в точката на неговото извикване, вместо да бъдат извиквани. Нека разберем вградените функции с пример.

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

В горната програма декларирах и дефинирах функцията Initialize () като вградена функция в клас „пример“. Кодът на функцията за инициализация () ще се разшири, когато се извика от обекта от класа „пример“. Функцията display (), дефинирана в примера на клас, не се декларира в линия, но може да се счита, че е включена от компилатора, като в C ++ функцията, дефинирана вътре в класа, автоматично се прави на линия от компилатора, като се вземе предвид дължината на функцията.


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

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

Макросът е „директива за препроцесори“. Преди компилиране програмата се преглежда от препроцесора и където някога намери макроса в програмата, тя замества този макрос по негово определение. Следователно макросът се счита за „заместител“. Нека изучим макрос с пример.

#include #define GREATER (a, b) ((a <b)? b: a) int main (void) {cout << "По-голямо от 10 и 20 е" << GREATER ("20", "10") << "н"; връщане 0; }

В горния код декларирах макро функция GREATER (), която сравнява и намирам по-големия брой от двата параметъра. Можете да забележите, че няма точка и запетая, която да прекрати макроса, тъй като макросът се прекратява само от новия ред. Тъй като макрос е просто заместване, той ще разшири кода на макроса, където е извикан.

  • Макросите винаги са дефинирани с главни букви, за да улеснят програмистите да идентифицират всички макроси в програмата по време на четене.
  • Макросът никога не може да бъде функция на член на даден клас, нито да има достъп до членовете на данните от който и да е клас.
  • Макро функцията оценява аргумента всеки път, когато се появи в дефиницията си, което води до неочакван резултат.
  • Макросът трябва да е с по-малък размер, тъй като по-големите макроси ненужно увеличават размера на кода.
  1. Основната разлика между вградено и макро е, че вградените функции се анализират от компилатора, докато макросите в програмата се разширяват от препроцесора.
  2. Ключовата дума, използвана за определяне на вградена функция, е „в редица„Като има предвид, че ключовата дума, използвана за определяне на макрос, е„#define“.
  3. След като вградената функция е decalre вътре в клас, тя може да бъде дефинирана или в клас, или извън клас. От друга страна, макрос винаги се дефинира в началото на програмата.
  4. Аргументът, предаден на вградените функции, се оценява само веднъж, докато компилация, докато аргументът макроси се оценява всеки път, когато в кода се използва макрос.
  5. Компилаторът може да не вгражда и разширява всички функции, дефинирани в клас. От друга страна, макросите винаги се разширяват.
  6. Кратките функции, които са дефинирани в клас без вградена ключова дума, автоматично се правят вградени функции. От друга страна, макросът трябва да бъде дефиниран конкретно.
  7. Функцията, която е вградена, може да получи достъп до членовете на класа, докато макрос никога не може да получи достъп до членовете на класа.
  8. За прекратяване на вградена функция е необходима затворена къдрава скоба, докато макросът се прекратява със старта на нов ред.
  9. Отстраняването на грешки става лесно за inlne функция, тъй като се проверява по време на компилация за всяка грешка. От друга страна, макрос не се проверява по време на компилация, така че отстраняването на грешки в макрос става трудно.
  10. Като функция, вградена функция обвързва членовете си в рамките на старт и затворени къдрави скоби. От друга страна, макросът няма символ за прекратяване, така че обвързването става трудно, когато макросът съдържа повече от един оператор.

Изводи:

Вградените функции са далеч по-убедителни от макро функцията. C ++ също предоставя по-добър начин за дефиниране на константа, която използва ключова дума „const“.