Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
Registre uložené volajúce (známe tiež ako volatilné registre):
* Definícia: Tieto registre sú zodpovednosťou volajúceho (funkcia uskutočňovaná hovor), aby sa zachovala, ak sú potrebné ich hodnoty po návrate Callee (volá sa funkcia).
* Mechanizmus: Pred zavolaním funkcie, ak má volajúci dôležité hodnoty uložené v registroch uložených volajúcim, musí tieto hodnoty tlačiť do zásobníka (alebo ich uložiť inde v pamäti). Po návrate Callee môže volajúci vložiť uložené hodnoty späť do týchto registrov.
* Vplyv na výkon:
* režijné náklady na mieste hovoru: Registre uložené volajúcim vedú k režijnej funkcii pri volacej funkcii. Každý hovor môže vyžadovať tlačenie a praskanie registrov, aj keď Callee tieto registre v skutočnosti nepoužíva.
* potenciálne menej režijné náklady, ak je Callee jednoduchý: Ak je Callee malý a nemusí používať veľa registrov, volajúci nemusí nič ukladať, takže hovor je relatívne efektívny. Volajúci ukladá iba registre, že vie, že potrebuje * a * Callee by mohol potenciálne clobber.
* Vhodný pre krátkodobé hodnoty: Dobré pre premenné, ktoré musia žiť iba v malom rozsahu, pretože úspor/obnovenie sa stáva menším obavám.
* Príklad: V mnohých konvenciách volania X86-64 (napríklad Systém V AMD64 ABI) sa registruje ako `rax`,` rcx`, `rdi`,` rsi`, `r8`,` r9`, `r10`,` r11` (a registre s pohyblivou bodkou, ako je `xmm0-xmm15` na niektorých systémoch).
registre uložené Callee (známe tiež ako nezávislé registre):
* Definícia: Tieto registre sú zodpovednosťou callee (Volá sa funkcia) na zachovanie. Ak ich chce Callee použiť, musí uložiť svoje pôvodné hodnoty na začiatku funkcie a pred návratom ich obnoviť.
* Mechanizmus: Callee tlačí pôvodné hodnoty týchto registrov na zásobník na začiatku jeho vykonania. Pred návratom sa Callee objaví tieto hodnoty späť do registrov a efektívne ich obnovuje do pôvodného stavu.
* Vplyv na výkon:
* v rámci Callee: Registre uložené Callee zavádzajú režijné náklady v rámci funkcie Callee. Každý Callee používajúci tieto registre musí vykonávať úspory a obnovenie bez ohľadu na to, čo volajúci robí.
* pre Callee pomocou mnohých registrov: Ak Callee potrebuje veľa registrov, používanie registrov uložených Callee môže byť efektívnejšie ako registre uložené volajúcim. Volajúci je zaručený, že tieto registre sa budú zachovať bez toho, aby museli robiť čokoľvek.
* Vhodný pre hodnoty s dlhou životnosťou: Dobré pre premenné, ktoré musia žiť vo veľkom funkčnom rozsahu, pretože režijná náklady na úsporu/obnovenie sa amortizuje po dlhšiu dobu ich používania.
* Príklad: V systéme X86-64 v AMD64 ABI sa registruje ako `rbx`,` rsp`, `rbp`,` r12`, `r13`,` r14`, `r15` sú uložené Callee. `RSP` je špeciálny (ukazovateľ zásobníka) a` RBP` (základný ukazovateľ) sa často používa na správu a ladenie rámcov rámu zásobníka.
Kľúčové rozdiely a dôsledky výkonu:
| Funkcia | Registre uložené volajúcim | Registre uložené Callee
| ---------------- | -------------------------------------------------------------------------------------------------------------
| Zodpovednosť | Volajúci na uloženie a obnovenie v prípade potreby pred zavolaním funkcie. | Callee na uloženie a obnovenie, ak ich používa Callee. |
| Režijné náklady Primárne pri volacej funkcii (potenciálne nie je režijné náklady, ak volajúci tieto registre nepotrebuje). | Predovšetkým v rámci nazývanej funkcie (režijné náklady, či volajúci potrebuje zachované registre). |
| Najlepšie použitie Keď volajúci potrebuje zachovať hodnoty iba v malej podskupine hovorov. | Ak je Callee veľký a pravdepodobne použije mnoho registrov, vyhnete sa volajúcemu, ktorý musí uložiť veľa možných registrov. |
| Príklad (x86-64) `rax`,` rcx`, `rdi`,` rsi`, `r8`,` r9`, `r10`,` r11` | `rbx`,` rsp`, `rbp`,` r12`, `r13`,` r14`, `r15` |
Čo je lepšie?
Neexistuje všeobecný „lepší“ prístup. Optimálna voľba závisí od špecifík volacích konvencií, štruktúry programu, frekvencie funkčných hovorov a veľkosti a zložitosti funkcií. Cieľom stratégií prideľovania registrov, ktoré používajú kompilátory a programátori, sa zameriavajú na minimalizáciu režijných nákladov ukladania a obnovovania registrov inteligentným výberom, ktoré sa registrujú na rôzne účely.
* Časté malé hovory: Výhodne by sa mohlo uplatniť volajúci, pretože volajúci šetrí iba to, čo potrebuje. Callee používa registre bez akýchkoľvek nákladov na úsporu/obnovenie.
* zriedkavé veľké hovory: Ak Callee používa mnoho registrov, môže byť vhodné, aby sa uložená Callee. Callee prevezme náklady na úsporu/obnovenie týchto registrov, ale volajúci je oslobodený od toho, aby predvídal, ktoré registre je potrebné uložiť.
v súhrne:
Výber medzi registrmi uloženými volajúcim a Callee sa vyžaduje kompromis medzi režijnými nákladmi na mieste hovoru a režijnými nákladmi v rámci volanej funkcie. Účinné prideľovanie registrov a konvencie volania sa zameriavajú na minimalizáciu tejto režijnej náklady na zlepšenie výkonu programu. Kompilátory a programátori montáž musia porozumieť týmto konceptom, aby optimalizovali kód pre efektívnosť. ABI (binárne rozhranie aplikácie) definuje, ktoré registre sú uložené volajúceho a ktoré sú uložené pre špecifickú architektúru a operačný systém.