Curs C++ | Sectiunea 21 – Functii Inline
Am discutat pana acum despre termenul de invocare a functiei fara a intra in detalii. Am presupus pur si simplu ca invocarea face automat ceea ce ar trebui.
💡 Vom analiza codul din perspectiva compilatorului. Citeste codul functiei, il traduce in limbaj masina si stocheaza acea traducere intr-o zona separata de memorie. Codul insa nu poate fi inca folosit asa cum este, mai avem nevoie de cativa pasi aditionali. Fiecare functie trebuie sa fie suplimentata cu doua elemente importante: prologul si epilogul.
Vom explica pe scurt cei doi noi termini deoarece vom avea o sectiune speciala in care vom discuta in amanunt despre tipurile de memorie folosite de un program. Astfel ca pentru moment ramanem cu urmatoarele explicatii.
❗ Prologul este partea de cod executata implicit in momentul invocarii functiei. Este responsabil pentru transferarea parametrilor si pregatirea stivei (stack), aceasta fiind o zona de memorie speciala, unde vor fi stocati acestia.
❗ Epilogul este partea de cod executata implicit dupa codul functiei. Este responsabil pentru transferarea rezultatului functiei si restabilirea stivei la starea initiala, curantand orice posibile valori salvate de prolog.
Prolog & Epilog
Urmatoarea diagrama ne descrie fluxul de lucru in momentul invocarii unei functii.
Aceasta abordare are un avantaj esential. Codul functiei, prologul si epilogul ocupa acelasi spatiu de memorie indiferent de cate ori este functia invocata. Altfel spus, invocarea in acest mod salveaza memorie si face programul nostru mai compact.
🌬️ Unul din cele mai interesante paradoxuri in programare spune ca un cod nu poate fi compact si in acelasi timp si rapid. In general, ori va fi compact dar nu rapid, ori invers.
🧠 Sa presupunem ca programul nostru ar trebui sa invoce functia noastra de foarte multe ori (sute de mii). Acest lucru inseamna ca va trebui sa platim un pret ridicat, exprimat in timp, pentru toate acele transferuri intre prolog-functie-epilog. Pretul este cu atat mai mare daca functia noastra este mica, mai mica decat prologul si epilogul.
Exemplul acesta ne arata ca unori, in cazuri bine definite, este mai rentabil sa evitam lantul de executie prolog-functie-epilog si sa inseram direct codul functiei in codul invocarii.
Functii Inline
💡 Diagrama de mai sus ne prezinta o alta abordare a invocarii unei functii. Cand functia este mica si rapida si cand ne asteptam ca aceasta sa fie invocata foarte des, este mai bine (si mai eficienta dpdv al timpului) sa o invocam astfel.
❗ Bineinteles, exista si o parte negativa al acestui lucru. Dimnesiunea ocupata de programul nostru va creste semnificativ.
🌟 Aceasta metoda de invocare poarta numele de function inlining iar o functie compilata astfel se numeste inline function.
Daca ne dorim sa sa compilam si invocam o functie ca inline, trebuie sa o marcam mai intai, in momentul declararii, cu keyword-ul inline. Nu coneaza daca plasam acest keyword inaine sau dupa tipul functiei.
Mai mult, daca avem atat declararea si definirea functiei, putem plasa keyword-ul inline pentru una si sa-l omitem pentru alta, ori putem sa il folosim in ambele variante. In orice situatie ar fi din cele 3 cazuri, rezultatul va fi cel dorit.
Aici se termina si aceasta sectiune 🙂 . Daca aveti intrebari suplimentare puteti folosi informatiile de aici.
➡ Sectiunea anterioara:Curs C++ | Sectiunea 20 – Functii (Parametri Default)
➡ Sectiunea urmatoare:Curs C++ | Sectiunea 22 – Functii Supraincarcate(Overloaded)

