Przeanalizujmy różnicę między inline i macro przy pomocy tabeli porównawczej.
Wykres porównania
Podstawa do porównania | Inline | Makro |
---|---|---|
Podstawowy | Funkcje inline są analizowane przez kompilator. | Makra są rozszerzane przez preprocesor. |
Składnia | inline return_type funct_name (parametry) {. . . } | #define nazwa_ makra char_sequence |
Używane słowa kluczowe | inline | #definiować |
Zdefiniowany | Można go zdefiniować wewnątrz lub na zewnątrz klasy. | Jest zawsze zdefiniowany na początku programu. |
Ocena | Ocenia argument tylko raz. | Ocenia argument za każdym razem, gdy jest używany w kodzie. |
Ekspansja | Kompilator nie może wstawiać i rozszerzać wszystkich funkcji. | Makra są zawsze rozszerzane. |
Automatyzacja | Krótkie funkcje zdefiniowane w klasie są automatycznie wprowadzane do funkcji inline. | Makra powinny być określone dokładnie. |
Dostęp | Funkcja inline member może uzyskać dostęp do elementów danych klasy. | Makra nigdy nie mogą być członkami klasy i nie mogą uzyskać dostępu do elementów danych klasy. |
Zakończenie | Definicja funkcji inline kończy się nawiasami klamrowymi na końcu funkcji inline. | Definicja makra kończy się z nową linią. |
Debugowanie | Debugowanie jest łatwe dla funkcji inline, ponieważ sprawdzanie błędów odbywa się podczas kompilacji. | Debugowanie staje się trudne dla makr, ponieważ sprawdzanie błędów nie występuje podczas kompilacji. |
Wiążący | Funkcja inline bardzo dobrze łączy wszystkie instrukcje w ciele funkcji, ponieważ treść funkcji zaczyna się i kończy nawiasami klamrowymi. | Makro napotyka problem z bindowaniem, jeśli ma więcej niż jedną instrukcję, ponieważ nie ma symbolu zakończenia. |
Definicja Inline
Funkcja inline wygląda jak zwykła funkcja, ale jest poprzedzona słowem kluczowym " inline ". Funkcje inline są funkcjami krótkookresowymi, które są rozszerzane w momencie ich wywoływania, zamiast wywoływania. Rozumiem funkcje wbudowane na przykładzie.
#include using namespace std; Przykład klasy {int a, b; public: inline void initialize (int x, int y) {a = x; b = y} void display () {cout << a << "" <W powyższym programie zadeklarowałem i zdefiniowałem funkcję initialization (), jako funkcję inline w klasie "example". Kod funkcji initialization () zostanie rozwinięty tam, gdzie jest wywoływany przez obiekt klasy "example". Funkcja display () zdefiniowana w klasie przykład nie jest deklarowana inline, ale może być uznana za wbudowaną przez kompilator, jako w C ++ funkcja zdefiniowana w klasie jest automatycznie tworzona w linii przez kompilator, biorąc pod uwagę długość funkcji.
- Funkcja inline redukuje narzut funkcji wywoływania i zwracania, co z kolei skraca czas wykonywania programu. Ponadto, argumenty są wypychane na stos, a rejestry są zapisywane, gdy wywoływana jest funkcja i resetowane po powrocie funkcji, co zajmuje czas, jest to unikane przez funkcje inline, ponieważ nie ma potrzeby tworzenia zmiennych lokalnych i parametrów formalnych za każdym razem .
- Funkcje Inline mogą być członkami klasy i mogą także uzyskać dostęp do elementu danych klasy.
- Funkcja inline redukuje czas wykonania programu, ale czasami, jeśli długość funkcji inline jest większa, rozmiar programu również wzrośnie z powodu zduplikowanego kodu. Dlatego dobrą praktyką jest wprowadzanie bardzo małych funkcji.
- Argument funkcji inline jest oceniany tylko raz.
Definicja makro
Makro jest "dyrektywą preprocesora". Przed kompilacją program jest sprawdzany przez preprocesor i gdziekolwiek znajduje makro w programie, zastępuje makro przez jego definicję. Dlatego makro jest uważane za "zastępowanie tekstu". Pozwól nam studiować makro na przykładzie.
#include #define GREATER (a, b) ((a <b)? b: a) int main (void) {cout << "Większy z 10 i 20 to" << GREATER ("20", "10") << "\ n"; return 0; }
W powyższym kodzie deklarowałem funkcję makro GREATER (), która porównuje i znajduje większą liczbę obu parametrów. Można zauważyć, że nie ma średnika kończącego makro, ponieważ makro jest kończone tylko przez nową linię. Ponieważ makro jest tylko zamiennikiem tekstu, rozszerzy kod makra, w którym jest wywoływany.
- Makra są zawsze definiowane wielkimi literami, aby ułatwić programistom identyfikację wszystkich makr w programie podczas czytania.
- Makro nigdy nie może być funkcją członkowską klasy ani nie może uzyskać dostępu do elementów danych żadnej klasy.
- Funkcja makro ocenia argument za każdym razem, gdy pojawia się w jego definicji, co powoduje nieoczekiwany wynik.
- Makro musi mieć mniejszy rozmiar, ponieważ większe makra niepotrzebnie zwiększą rozmiar kodu.
Kluczowe różnice między Inline i Macro
- Podstawowa różnica między wersją i makrem polega na tym, że funkcje inline są analizowane przez kompilator, podczas gdy makra w programie są rozszerzane przez preprocesor.
- Słowo kluczowe użyte do zdefiniowania funkcji inline jest " inline ", natomiast słowo kluczowe użyte do zdefiniowania makra to " #define ".
- Gdy funkcja inline jest deaktywowana wewnątrz klasy, może być zdefiniowana w klasie lub poza klasą. Z drugiej strony makro jest zawsze definiowane na początku programu.
- Argument przekazywany do funkcji inline jest oceniany tylko raz podczas kompilacji, podczas gdy argumenty makr są oceniane za każdym razem, gdy w kodzie używane jest makro.
- Kompilator nie może wstawiać i rozszerzać wszystkich funkcji zdefiniowanych w klasie. Z drugiej strony makra są zawsze rozbudowywane.
- Krótka funkcja zdefiniowana w klasie bez wbudowanego słowa kluczowego jest automatycznie tworzona w funkcji inline. Z drugiej strony, Makro powinno być zdefiniowane konkretnie.
- Funkcja wbudowana może uzyskać dostęp do elementów klasy, podczas gdy makro nigdy nie może uzyskać dostępu do elementów klasy.
- Aby zakończyć funkcję inline, wymagany jest zamknięty nawias klamrowy, podczas gdy makro kończy się wraz z początkiem nowego wiersza.
- Debugowanie staje się łatwe dla funkcji inlne, ponieważ podczas kompilacji jest sprawdzane, czy nie ma błędów. Z drugiej strony makro nie jest sprawdzane podczas kompilacji, więc debugowanie makra staje się trudne.
- Będąc funkcją, funkcja inline wiąże swoje elementy w nawiasach startowych i zamkniętych. Z drugiej strony makro nie ma żadnego symbolu zakończenia, więc powiązanie staje się trudne, gdy makro zawiera więcej niż jedną instrukcję.
Wnioski:
Funkcje inline są znacznie bardziej przekonujące niż funkcja makro. C ++ zapewnia również lepszy sposób definiowania stałej, która używa słowa kluczowego "const".