Давайте вивчимо різницю між вкладеним і макросом за допомогою діаграми порівняння.
Діаграма порівняння
Основа для порівняння | В лінію | Макрос |
---|---|---|
Основний | Вбудовані функції обробляються компілятором. | Макроси розширюються препроцесором. |
Синтаксис | inline return_type funct_name (параметри) {. . . } | #define macro_name char_sequence |
Використані ключові слова | в лінію | #define |
Визначений | Він може бути визначений всередині або поза класом. | Він завжди визначається на початку програми. |
Оцінка | Він оцінює аргумент лише один раз. | Він оцінює аргумент кожного разу, коли він використовується в коді. |
Розширення | Компілятор може не вбудовувати і розширювати всі функції. | Макроси завжди розширюються. |
Автоматизація | Короткі функції, визначені всередині класу, автоматично робляться на вбудовані функції. | Макроси повинні бути конкретно визначені. |
Доступ | Функція вбудованого члена може отримати доступ до членів даних класу. | Макроси ніколи не можуть бути членами класу і не можуть отримати доступ до членів класу. |
Припинення | Визначення вбудованої функції закінчується фігурними дужками в кінці вбудованої функції. | Визначення макросу закінчується новою лінією. |
Налагодження | Налагодження легко для вбудованої функції, оскільки перевірка помилок виконується під час компіляції. | Налагодження стає важким для макросів, оскільки під час компіляції не відбувається перевірка помилок. |
Прив'язка | Вбудована функція дуже добре пов'язує всі твердження в тілі функції, а тіло функції починається і закінчується фігурними дужками. | Макрос стоїть перед проблемою прив'язки, якщо він має більше одного оператора, оскільки він не має символу завершення. |
Визначення Inline
Функція inline виглядає як звичайна функція, але передує ключовому слову " inline ". Вбудовані функції - це функції короткої довжини, які розгортаються в точці виклику, а не викликаються. Давайте зрозуміємо вбудовані функції з прикладом.
#include з використанням простору імен std; Приклад класу {int a, b; public: inline void ініціалізують (int x, int y) {a = x; b = y} void display () {cout << a << "<У наведеній вище програмі я оголосив і визначив функцію ініціалізації (), як вбудовану функцію в класі “example”. Код функції ініціалізації () розшириться там, де він викликається об'єктом класу "example". Функція display (), визначена в прикладі класу, не оголошується вбудованою, але її може вважати вбудований компілятором, У C ++ функція, визначена всередині класу, автоматично вбудовується компілятором з урахуванням довжини функції.
- Функція inline зменшує накладні витрати на виклик функції і повернення, що в свою чергу скорочує час виконання програми. Крім того, аргументи висуваються на стек і регістри зберігаються, коли функція викликається і скидається, коли функція повертається, що вимагає часу, це уникнути вбудованими функціями, оскільки не потрібно створювати локальних змінних і формальних параметрів щоразу .
- Вбудовані функції можуть бути членом класу і можуть також отримати доступ до члена даних класу.
- Вбудована функція зменшує час виконання програми, але іноді, якщо довжина вбудованої функції більше, то розмір програми також збільшиться через дубльований код. Отже, добре вбудовувати дуже малі функції.
- Аргумент вбудованої функції оцінюється тільки один раз.
Визначення макросу
Макро - це "директива препроцесора". Перед компіляцією програма перевіряється препроцесором і там, де він знаходить макрос у програмі, він замінює цей макрос своїм визначенням. Отже, макрос розглядається як «заміна тексту». Дослідимо макрос з прикладом.
#include #define GREATER (a, b) ((a <b)? b: a) int main (void) {cout << "Більше 10 і 20" << GREATER ("20", "10") << "\ t return 0; }
У наведеному вище коді я оголосив макро функцію GREATER (), яка порівнює і знаходить більшу кількість обох параметрів. Можна спостерігати, що немає крапки з комою для завершення макросу, оскільки макрос припиняється тільки новою лінією. Оскільки макрос - це просто заміна тексту, він розширить код макросу, де він викликається.
- Макроси завжди визначаються великими літерами, щоб полегшити програмістам визначити всі макроси в програмі під час читання.
- Макрос ніколи не може бути функцією-членом класу, а також не може отримати доступ до членів даних будь-якого класу.
- Функція макросу оцінює аргумент кожного разу, коли вона з'являється у визначенні, що призводить до несподіваного результату.
- Макрос має бути меншого розміру, оскільки великі макроси невиправдано збільшать розмір коду.
Ключові відмінності між вбудованим і макрозображенням
- Основна відмінність між вбудованим і макросом полягає в тому, що вбудовані функції обробляються компілятором, тоді як макроси в програмі розширюються препроцесором.
- Ключове слово, яке використовується для визначення вбудованої функції - " inline ", тоді як ключове слово, яке використовується для визначення макросу, є " #define ".
- Після того, як вбудована функція є decalre всередині класу, вона може бути визначена або всередині класу або поза класом. З іншого боку, макрос завжди визначається на початку програми.
- Аргумент, переданий вбудованим функціям, оцінюється тільки один раз під час компіляції, тоді як аргумент макросів оцінюється кожного разу, коли в коді використовується макрос.
- Компілятор може не вбудовувати і розширювати всі функції, визначені всередині класу. З іншого боку, макроси завжди розширюються.
- Короткі функції, які визначені всередині класу без вбудованого ключового слова, автоматично робляться вбудованими функціями. З іншого боку, макрос повинен бути визначений конкретно.
- Функція, яка є вбудованою, може отримати доступ до членів класу, тоді як макрос ніколи не може отримати доступу до членів класу.
- Для завершення вбудованої функції необхідна закрита фігурна дужка, тоді як макрос припиняється з початку нового рядка.
- Налагодження стає простим для функції inlne, оскільки вона перевіряється під час компіляції для будь-якої помилки. З іншого боку, макрос не перевіряється під час компіляції, тому налагодження макросу стає важким.
- Будучи функцією, вбудована функція зв'язує своїх членів у старті і закриває фігурні дужки. З іншого боку, макрос не має будь-якого символу завершення, тому зв'язування стає складним, коли макрос містить більше, ніж одну операцію.
Висновки:
Вбудовані функції набагато більш переконливі, ніж макро функція. C ++ також забезпечує кращий спосіб визначення константи, яка використовує ключове слово "const".