Built-in functii (inline) pentru cei care nu știu, cât și pentru cei care au uitat, software-ul Intel ®

Punerea argumentul în stivă, funcția de transfer de control și să se întoarcă de la ea, eliberarea stivei - toate acestea fac ca costurile, care sunt ușor, dar afectează viteza. Puteți obține un câștig în timp, dacă vă da compilator pentru a copia codul funcției direct în codul de program al apelantului, mai degrabă decât crearea unei funcții în memorie. Aceste funcții sunt numite încorporate (inline).







Un exemplu banal al unui apel de funcție încorporată:


Trebuie remarcat faptul că inline - doar o recomandare și nu o comandă pentru compilator pentru a înlocui apelurile funcțiile corpului ei. Se poate calcula inserarea necorespunzătoare și pur și simplu ignorați modificator inline și să trateze funcția ca de obicei. Deci, acestea fiind spuse, toată voința compilator. (Aprox. În Windows există modificator __forceinline. Care determină compilatorul pentru a încorpora funcția)

De ce este uneori mai bine să ignore modificator inline?
Să vedem cum funcțiile inline pot afecta unele caracteristici ale programului.

viteza:

  • mai rapid - introducerea codului funcție în codul programului va contribui la evitarea utilizării unor reglementări inutile (apel de funcție și a reveni legate de acesta)
  • încet - utilizarea prea frecventă a funcțiilor inline la aceeași mari, va conduce la lărgirea codului (în plus față de acest lucru, compilatorul uneori obligați să utilizeze mai multe variabile temporare pentru a păstra semantica), ceea ce poate duce la derapaj, adică, în mod constant necesare în procesul de a programului de sistem de operare grunduiri noi pagini

Dimensiunea fișierului executabil:

  • crește - după cum sa menționat deja, utilizarea prea frecventă a funcțiilor inline la aceeași mari, va conduce la lărgirea codului și, în consecință, o creștere a dimensiunii fișierului executabil
  • a redus - datorită dimensiunii executabil compilator de optimizare poate fi redus prin utilizarea funcțiilor inline foarte mici ca compilatorul fără a fi nevoie de a crea „extra“ instrucțiuni pentru a apela și de ieșire din, premisele argumente pe stivă și înapoi. De asemenea, în timpul punerii în aplicare a unei mari functii incorporate in codul programului de optimizare compilator poate elimina cod redundante, care, la rândul său, poate reduce dimensiunea fișierului.







Alunecarea (treierat):

  • crește - utilizarea prea frecventă a funcțiilor inline la aceeași mari, va conduce la lărgirea codului, care ar putea duce la derapaje, și anume, în mod constant necesare în procesul de a programului de sistem de operare grunduiri noi pagini
  • scădea - poate reduce cantitatea de pagini de memorie virtuală să fie în memorie simultan. De exemplu, în cazul în care f () este o funcție funcție g (). Codurile funcționale sunt susceptibile de pe diferite pagini de memorie virtuală, cu introducerea codului funcției compilator g () în codul funcției f (). de multe ori ambele funcții codul este pe aceeași pagină

Multiply definite
Compilatorul poate insera codul de funcție în organism numai în cazul în care corpul ei este în unitatea de traducere curentă. Astfel, funcțiile încorporate trebuie să fie definite în fiecare unitate de traducere în care acestea sunt utilizate, care nu le place linker-ul.
așa-numitele personaje slabe (slab) au fost create pentru a rezolva această problemă. Odată ce linkerul găsește unul dintre aceste personaje, restul vor fi ignorate. Chiar dacă compilatorul ignoră modificatorul, aranjamentul ar fi de succes.
Inline modificator Due. caracter funcția devine un caracter slab. astfel încât să puteți pune în condiții de siguranță funcția de linie într-un singur * .h-fișier și să-l utilizați în diferite unități de traducere.
exemplu:

g ++ test.cpp -c
g ++ test1.cpp -c
g ++ test.o test1.o o- // inline fără o eroare „definiție multiplă“

Ei bine, ceea ce cu macro-uri?
Rețineți că macro-urile sunt preprocesată și compilatorul inline-funcții. Deoarece macro-uri nu sunt vizibile pentru compilator, acestea sunt mai greu de depanare.
Funcții inline sunt conștienți de domeniul de aplicare și de a face tipul de test, spre deosebire de macro.
Funcții încorporate pot fi supraîncărcate functii membre, modele set și au alte avantaje care nu sunt macro-uri disponibile.

Cine stie despre modificatorul Inline?
Modificator sprijinit C ++, C99, GNU C. Mai mult decât atât, toate standardele lucrează cu diferite modificator.

Astfel,
1) pentru utilizare încorporat funcțiile corespunzătoare pot îmbunătăți performanța și pentru a reduce dimensiunea fișierului executabil.
2) S-ar putea (și ar trebui) să fie definite în diferite unități de traducere
3) Pentru funcția inline a dat un câștig semnificativ în comparație cu funcția normală, aceasta trebuie să fie de dimensiuni mici.
4) compilatorul va face în continuare totul în, modificator de linie este doar un indiciu. El poate ignora modificatorul unde este și a pus-o acolo unde nu există.

Pentru mai multe informații despre posibilitățile de optimizări compilator, consultați Termeni de optimizare.