Úvod
Nejpřímější strategií sběru odpadu je počítání referencí. Počítání referencí je velmi jednoduché, ale je důležité, aby vyhovovalo potřebám kompilátoru a zvyšuje funkci přiřazení nákladů (mutátor) (tento termín je pro uživatelský program, z pohledu garbage collector). Každý objekt má přiřazený počet odkazů – počet aktivních odkazů na objekt. Pokud je počet odkazů na objekt nulový, pak je to nesmysl (uživatelský program ho nemůže dosáhnout) a lze jej recyklovat. Úpravou ukazatelů při každém odkazu na čas (například příkazem přiřazení) nebo když je odkaz mimo rozsah, musí kompilátor vygenerovat kód pro aktualizaci počtu odkazů referenčního objektu. Pokud se počet odkazů na objekt stane nulovým, lze jej spustit okamžitě obnovit tento blok (počet odkazů všech bloků a blok je obnoven, aby se snížila reference), nebo jej shromáždit se zpožděním ve frontě.
Komponenta com bude udržovat referenční hodnotu počtu, na kterou se odkazuje. Když klient získá z komponenty rozhraní, zvýší se tím počet referencí. Po ukončení používání klientského rozhraní, modulu počtu referencí Save 1. Když je hodnota počtu referencí 0, komponenta může být vymazána z vlastní paměti.
pomocí počítání referencí
Pročdůvod
Chcete-li se rozhodnout udržovat samostatnou referenci pro každý počet rozhraní namísto počtu referencí pro celou sestavu, která jej má udržovat?
Existují dva hlavní důvody: Za prvé, usnadnit ladění; Dalším důvodem je požadavek na přístup k podpůrným zdrojům.
1 ladění:
předpoklady zapomínají na volání rozhraní Release (ve skutečnosti tuto chybu dělá mnoho lidí) v programu. Takové komponenty nebudou nikdy odstraněny, protože je pouze v počtu odkazů 0:00 bude voláno delete. Poté musíte zjistit, kdy a kde by mělo být rozhraní uvolněno. Samozřejmě je velmi těžké najít. V případě pouze jednoho rozhraní udržovat celou sestavu pro takový výsledek je obtížnější najít. V tuto chvíli musí být všechna rozhraní zkontrolována pomocí kódu poskytovaného touto komponentou. Pokud jsou však komponenty podporovány pro každé rozhraní, které udržuje referenční počet, můžete najít řadu omezení pro konkrétní rozhraní. V některých případech to může ušetřit spoustu času.
2. Získejte potřebné zdroje
může při implementaci rozhraní vyžadovat hodně paměti nebo jiných zdrojů. V tomto případě může dokončit alokaci zdrojů, když klient požaduje toto rozhraní v implementaci QueryInterface. Pokud však počet referencí udržuje pouze celou sestavu, komponenty nemohou určit, kdy je bezpečné uvolnit část této paměti spojené s rozhraním. Ale základní počet referencí udržovaný samostatně pro každé rozhraní, můžete se rozhodnout, kdy uvolnit tuto paměť, bude mnohem jednodušší.
Guize
správné použití reference počítající tři jednoduchá pravidla
1. Tiaoyong AddRef před návratem. U funkcí, které lépe sestavují, by měl ukazatel rozhraní před vrácením odpovídajícího ukazatele volat AddRef. Tyto funkce zahrnují QueryInterface a CreateInstance. Takže když klient získal z takového rozhraní funkci. Nebude nutné volat AddRef.
2. Po použití rozhraní po volání Release. Po použití rozhraní by se mělo něco nazývat Release function interface.
3. Po zadání zavolejte AddRef. Když ukazatel rozhraní přiřazený jinému ukazateli rozhraní by měl volat AddRef. Jinými slovy, po vytvoření reference mimo rozhraní by se neměl zvýšit počet odkazů odpovídající komponenty.
Rozhraní
v zobrazení klienta je počet odkazů na úrovni rozhraní, nikoli na úrovni komponent. Ale z hlediska implementace, jejíž referenční počet není zaznamenán prakticky žádný vztah. Zákazníci mohou věřit, že přímá komponenta zaznamená, že každé rozhraní samo o sobě udržuje referenční počet. Ale klient nemůže předpokládat, že celá sestava bude udržovat jeden referenční počet.
Pro zákazníky je každé rozhraní samostatně udržovaným počtem referencí, což znamená, že zákazníci by měli zavolat AddRef, protože ukazatel bude použit místo jakéhokoli jiného ukazatele. Zákazníci by měli zavolat na jejich Release.
zvolte zachovat samostatnou referenci pro každý počet rozhraní spíše než referenční počet důvodů pro údržbu celé sestavy:
usnadnit ladění; požadovat přístup k podpůrným zdrojům; < / p>
uvedení do provozu
lze dosáhnout zvýšením a snížením hodnoty čísla.
Všimněte si také, že návratová hodnota AddRef a Release nedává smysl, ale může se hodit při ladění programu. Zákazníci by tuto hodnotu neměli používat, protože se jedná o přesný odkaz na číslo součásti nebo rozhraní.
pravidla
zákaznická rozhraní musí být zpracována jako referenční počet pro každé rozhraní má samostatný. Proto musí zákazníci odkazovat na počet odděleně pro různá rozhraní, i když je jejich životnost vnořená.
a, pravidlo výstupního parametru
znamená, že výstupní parametry volajícímu funkce vrátí hodnotu parametru funkce. Od jedné hodiny z hlediska efektu je návratová hodnota výstupního parametru podobná stejné funkci. Všechny výstupní parametry vrácené jako návratová hodnota nebo ukazatel na nové rozhraní nějaké funkce musí být ukazatele rozhraní AddRer.
Za druhé, vstupní parametry pravidla
ukazatel rozhraní předán funkci bez volání AddRef a Release, je to proto, že životnost vnořené funkce v životě volajícího.
Za třetí, pravidlo vstupních a výstupních parametrů
Vstup - Výstupní parametry jak vstupní parametry, tak výstupní parametry funkce. Funkci lze použít ve zbytku hodnot vstupních - výstupních parametrů, poté lze tyto hodnoty upravit a vrátit je volajícímu.
ve funkci pro vstupní - výstupní parametry předávané v ukazateli rozhraní musí před přiřazením jiné hodnotě ukazatele rozhraní zavolat Release. Než se funkce vrátí, musíte zavolat výstupní parametry AddRef uložené v ukazateli rozhraní.
Za čtvrté, pravidla pro lokální proměnné
Pro aktuální domácí ukazatele rozhraní, ale pouze kvůli jejich přítomnosti v životě své funkce, a proto není třeba volat AddRef a Release. Toto pravidlo je vlastně přímým výsledkem vstupních parametrů pravidla. V následujícím příkladu pIX2 pouze ve funkci foo lifetime, čímž je zajištěno, že jeho životnost bude vnořena do doby životnosti příchozího ukazatele pIX, není třeba volat AddRef a Release pIX2.
pět pravidel globálních proměnných
na ukazatel rozhraní uložený v globální proměnné, než je předán jiné funkci, musí zavolat AddRef. Protože je tato proměnná globální, lze použít jakoukoli funkci k ukončení jejich životnosti voláním její Release. U ukazatele rozhraní uloženého v členské proměnné by se s ním mělo také zacházet. Protože všechny členské funkce této třídy jsou, stav ukazatele rozhraní se může změnit.
Šest pravidel
Když nelze určit pro jakoukoli nejistou situaci, měli byste zavolat AddRef a Release right.
Při určování, že má být optimalizován, by navíc neměly být žádné ukazatele na počet odkazů s odpovídajícími komentáři nebo další programátoři při úpravě kódu, může to prodloužit životnost ukazatele rozhraní a tím uzavřít optimalizaci počtu odkazů zničeno.
Chyba zapomenout zavolat Příčinu uvolnění může být obtížnější zjistit než nezavolat AddRef. Hlavní výhoda ve srovnání se sledováním sběru odpadků
výhody a vady
, referenční počet objektu se již nepoužívá lze obnovit co nejdříve, zároveň nevede k procesu obnovy dlouhá pauza, také jasně označeno životní cyklus každého objektu.
v aplikacích pracujících v reálném čase nebo v systémech s omezenou pamětí je odezva v reálném čase důležitým ukazatelem a počet referencí je jedním z nejsnáze implementovatelných garbage collection, je vhodný pro daný případ. Referenční počet lze také použít ke správě jiných nepaměťových zdrojů, jako je objekt operačního systému (často vzácnější než paměťové prostředky). Technologie sledování sběru odpadků se s takovým cílem vypořádá pomocí terminátoru, ale opožděná obnova může vést k dalším problémům. Váha je aplikována na referenční počet odvozené umělecké distribuované systémy.
na dostupné paměti je zaplněno aktivní cílovou platformou, bude sledování odpadu často spouštěno, čímž se sníží výkon. Počet referencí i v případě paměti na hranici vyčerpání výkonu stále zůstává zachován. Počet referencí také pro další optimalizační techniky pro poskytování referenčních informací za běhu, například mnoho systémů pro neměnný objekt (např. funkční programovací jazyk), velký počet duplicitních objektů může vést k vážnému snížení výkonu; v takovém systému jsou typická optimalizační opatření: budoucnost, pokud je objekt vytvořen pouze jednou a jiný podobný objekt je vytvořen ve stejnou dobu, kdy již není odkazován (jako je operátor přiřazení řetězců v Javascriptu), můžete odstranit původní objekt vytvoří nový objekt, chování se změní na původní objekt, čímž se zvýší efektivita. Referenční počet může poskytnout dostatečné referenční informace pro takovou optimalizaci.
optimalizovaný počet referencí beze stopy v porovnání Sběr odpadu má dvě hlavní nevýhody, musíme zavést další mechanismy pro opravu:
-
často aktualizovaný počet referencí Sníží provozní efektivitu.
-
Problém s cyklickou referencí původního počtu referencí nelze vyřešit. Prostorová lokalita
Dále, pokud je alokace paměti volného seznamu, pak je počet odkazů velmi špatný. Použití pouze referenčního počtu CPU cache ke zlepšení výkonu přesouváním objektů, bude vysoce výkonný alokátor paměti implementovat jak tracking garbage collector ke zlepšení výkonu. Mnoho referenčních implementací (například PHP a Objective-C) má špatný výkon, protože nerealizovalo kopii paměti.