La oss studere forskjellen mellom inline og makro ved hjelp av sammenligningstabell.
Sammenligningstabel
Grunnlag for sammenligning | På linje | Makro |
---|---|---|
grunn~~POS=TRUNC | Inline-funksjoner blir analysert av kompilatoren. | Makroer utvides av forprosessoren. |
syntax | inline return_type funct_name (parametere) {. . . } | #define macro_name char_sequence |
Nøkkelord brukt | på linje | #definere |
definert | Det kan defineres innenfor eller utenfor klassen. | Det er alltid definert ved starten av programmet. |
evaluering | Det vurderer argumentet bare én gang. | Den vurderer argumentet hver gang det brukes i koden. |
Ekspansjon | Kompilatoren kan ikke inkludere og utvide alle funksjonene. | Makroer blir alltid utvidet. |
Automasjon | De korte funksjonene, definert inne i klassen, gjøres automatisk på inline-funksjoner. | Makroer bør defineres spesifikt. |
Tilgang | En inline-medlemsfunksjon kan få tilgang til dataens medlemmer av klassen. | Makroer kan aldri være medlemmer av klassen og kan ikke få tilgang til data-medlemmene i klassen. |
Avslutning | Definisjon av inline-funksjonen avsluttes med de krøllede parentesene på slutten av inline-funksjonen. | Definisjon av makro avsluttes med den nye linjen. |
debugging | Feilsøking er enkelt for en inline-funksjon som feilkontroll er gjort under kompilering. | Feilsøking blir vanskelig for makroer fordi feilkontroll ikke oppstår under kompilering. |
binding | En inline-funksjon binder alle setningene i funksjonens kropp veldig bra, ettersom funksjonens kropp begynner og slutter med de krøllete parentesene. | En makro står overfor bindingsproblemet hvis det har mer enn en setning, da det ikke har et termineringssymbol. |
Definisjon av Inline
En inline-funksjon ser ut som en vanlig funksjon, men er foran søkeordet " inline ". Inline-funksjoner er kortlengdefunksjoner som utvides ved tidspunktet for påkallingen, i stedet for å bli kalt. La oss forstå inline-funksjoner med et eksempel.
#include bruker navneområde std; klasseeksempel {int a, b; offentlig: inline void initialize (int x, int y) {a = x; b = y} void display () {cout << a << "" <I det ovennevnte programmet har jeg deklarert og definert funksjonaliseringen (), som en inline-funksjon i klassen "Eksempel". Koden for initialiseringen () -funksjonen vil utvide hvor den påberopes av objektet til klassen "eksempel". Funksjonsdisplayet (), som er definert i klasseeksemplet, er ikke deklarert, men det kan betraktes som inline av kompilatoren, som I C ++ blir funksjonen som er definert inne i klassen automatisk gjort inline av kompilatoren i forhold til lengden på funksjonen.
- Inline-funksjonen reduserer overhead for funksjonen ringer og returnerer, noe som igjen reduserer tidspunktet for utførelsen av programmet. Argumenterne blir også presset på stakken og registerene lagres når en funksjon kalles og tilbakestilles når funksjonen kommer tilbake, noe som tar tid, dette unngås av inline-funksjonene, da det ikke er nødvendig å opprette lokale variabler og formelle parametere hver gang .
- Inline-funksjoner kan være medlem av klassen og kan også få tilgang til data-medlem av klassen.
- Inline-funksjonen reduserer tidspunktet for utførelsen av programmet, men noen ganger hvis lengden på inline-funksjonen er større, vil størrelsen på programmet også øke på grunn av duplisert kode. Derfor er det en god praksis å legge inn svært små funksjoner.
- Inline-funksjonens argument vurderes kun én gang.
Definisjon av makro
Makro er et "forprosessor-direktiv". Før kompilering blir programmet undersøkt av forprosessoren, og hvor som helst den finner makroen i programmet, erstatter den makroen ved sin definisjon. Derfor betraktes makroen som «tekstutskifting». La oss studere makro med et eksempel.
#include #define GREATER (a, b) ((a <b)? b: a) int main (void) {cout << "Større 10 og 20 er" << GREATER ("20", "10") << "\ n"; returner 0; }
I overkoden erklærte jeg en makrofunksjon GREATER (), som sammenligner og finner det største antallet av begge parameterne. Du kan observere at det ikke er noen semikolon for å avslutte makroen, da makroen bare avsluttes av den nye linjen. Som en makro er en bare en tekstutskifting, vil den utvide makrokoden der den påberopes.
- Makroene er alltid definert i store bokstaver bare for å gjøre det enkelt for programmererne å identifisere alle makroene i programmet mens de leses.
- Makroen kan aldri være en klasses medlemsfunksjon, og den kan heller ikke få tilgang til data-medlemmene i noen klasse.
- Makrofunksjonen evaluerer argumentet hver gang det vises i definisjonen som resulterer i et uventet resultat.
- Makro må være av mindre størrelse da de større makroene vil unødvendig øke størrelsen på koden.
Viktige forskjeller mellom inline og makro
- Den grunnleggende forskjellen mellom inline og makro er at en inline-funksjon analyseres av kompilatoren, mens makroene i et program blir utvidet av preprosessoren.
- Søkeordet som brukes til å definere en inline-funksjon er " inline ", mens søkeordet som brukes til å definere en makro, er " #define ".
- Når inline-funksjonen er decalre inne i en klasse, kan den defineres enten inne i en klasse eller utenfor en klasse. På den annen side er en makro alltid definert ved starten av programmet.
- Argumentet som sendes til inline-funksjonene, blir evaluert bare én gang mens kompilering mens makro-argumentet blir evaluert hver gang en makro brukes i koden.
- Kompilatoren må ikke inkludere og utvide alle funksjonene som er definert i en klasse. På den annen side blir makroer alltid utvidet.
- Kortfunksjonen som er definert inne i en klasse uten inline-søkeord, blir automatisk gjort inline-funksjoner. På den annen side skal makro spesifiseres spesifikt.
- En funksjon som er inline, kan få tilgang til klassens medlemmer, mens en makro aldri kan få tilgang til klassens medlemmer.
- For å avslutte en inline-funksjon, kreves en lukket krøllestang, mens en makro avsluttes med starten på en ny linje.
- Feilsøking blir enkelt for inlne-funksjonen som den er merket under kompilering for eventuelle feil. På den annen side blir ikke en makro merket mens kompilering er, og det blir vanskelig å feilsøke en makro.
- Å være en funksjon, binder en inline-funksjon til medlemmene i en start og lukket krøllestang. På den annen side har makro ikke noe termineringssymbol, slik at bindingen blir vanskelig når makro inneholder mer den ene setningen.
konklusjoner:
Inline-funksjonene er langt mer overbevisende enn makrofunksjonen. C ++ gir også en bedre måte å definere en konstant, som bruker et "const" søkeord.