CFixedStringT: Příklad vlastního správce řetězců
Knihovna ATL implementuje jeden příklad vlastního správce řetězců, který používá třída CFixedStringT s názvem CFixedStringMgr. CFixedStringT
je odvozen z CStringT a implementuje řetězec, který přiděluje jeho znaková data jako součást samotného objektu CFixedStringT
, pokud je řetězec menší než délka určená t_nChars
parametrem CFixedStringT
šablony . Při tomto přístupu řetězec vůbec nepotřebuje haldu, pokud délka řetězce nevyroste nad velikost pevné vyrovnávací paměti. Vzhledem k tomu CFixedStringT
, že haldu vždy nepoužívá k přidělení řetězcových dat, nemůže použít CAtlStringMgr
jako správce řetězců. Používá vlastního správce řetězců (CFixedStringMgr
), implementující IAtlStringMgr rozhraní. Toto rozhraní je popsáno v implementaci vlastního správce řetězců (Pokročilá metoda).
Konstruktor pro CFixedStringMgr
přebírá tři parametry:
pData: Ukazatel na pevnou
CStringData
strukturu, která se má použít.nChars: Maximální počet znaků, které
CStringData
struktura může obsahovat.pMgr: Ukazatel na
IAtlStringMgr
rozhraní "správce záložních řetězců".
Konstruktor ukládá hodnoty pData a pMgr do příslušných členských proměnných (m_pData
a m_pMgr
). Potom nastaví délku vyrovnávací paměti na nulu, dostupnou délku rovnající se maximální velikosti pevné vyrovnávací paměti a referenčnímu počtu -1. Hodnota počtu odkazů označuje, že vyrovnávací paměť je uzamčena a použít tuto instanci CFixedStringMgr
jako správce řetězců.
Označení vyrovnávací paměti jako uzamčené brání ostatním CStringT
instancím ve sdíleném odkazu na vyrovnávací paměť. Pokud by jiné CStringT
instance měly povoleno sdílet vyrovnávací paměť, bylo by možné odstranit vyrovnávací paměť obsaženou v CFixedStringT
době, kdy ostatní řetězce stále používaly vyrovnávací paměť.
CFixedStringMgr
je úplná implementace IAtlStringMgr
rozhraní. Implementace každé metody je popsána samostatně.
Implementace CFixedStringMgr::Allocate
Implementace CFixedStringMgr::Allocate
prvních kontrol zjistí, jestli je požadovaná velikost řetězce menší nebo rovna velikosti pevné vyrovnávací paměti (uložená v členu m_pData
). Pokud je pevná vyrovnávací paměť dostatečně velká, CFixedStringMgr
zamkne pevnou vyrovnávací paměť o délce nuly. Pokud délka řetězce nepřeroste nad velikost pevné vyrovnávací paměti, CStringT
nebude nutné vyrovnávací paměť relokovat.
Pokud je požadovaná velikost řetězce větší než pevná vyrovnávací paměť CFixedStringMgr
, předá požadavek správci záložních řetězců. Předpokládá se, že správce záložních řetězců přidělí vyrovnávací paměť z haldy. Před vrácením této vyrovnávací paměti však vyrovnávací paměť CFixedStringMgr
uzamkne a nahradí ukazatel správce řetězců vyrovnávací paměti ukazatelem na CFixedStringMgr
objekt. Tím se zajistí, že se pokusy o přidělení nebo uvolnění vyrovnávací paměti voláním CStringT
CFixedStringMgr
.
Implementace CFixedStringMgr::ReAllocate
Provádění CFixedStringMgr::ReAllocate
je velmi podobné jeho provádění Allocate
.
Pokud je vyrovnávací paměť relokovaná jako pevná vyrovnávací paměť a požadovaná velikost vyrovnávací paměti je menší než pevná vyrovnávací paměť, není provedeno žádné přidělení. Pokud však vyrovnávací paměť, která se relokuje, není pevnou vyrovnávací pamětí, musí se jednat o vyrovnávací paměť přidělenou správci zálohování. V takovém případě se správce zálohování používá k opětovnému přidělení vyrovnávací paměti.
Pokud je vyrovnávací paměť relokovaná jako pevná vyrovnávací paměť a nová velikost vyrovnávací paměti je příliš velká, aby se vešla do pevné vyrovnávací paměti, CFixedStringMgr
přidělí novou vyrovnávací paměť pomocí správce zálohování. Obsah pevné vyrovnávací paměti se pak zkopíruje do nové vyrovnávací paměti.
Implementace CFixedStringMgr::Free
Implementace CFixedStringMgr::Free
se řídí stejným vzorem jako Allocate
a ReAllocate
. Pokud je vyrovnávací paměť uvolněna pevnou vyrovnávací pamětí, metoda ji nastaví na uzamčenou vyrovnávací paměť s nulovou délkou. Pokud byla uvolněná vyrovnávací paměť přidělena správci zálohování, CFixedStringMgr
pomocí správce zálohování ji uvolní.
Implementace CFixedStringMgr::Clone
Implementace CFixedStringMgr::Clone
vždy vrací ukazatel na správce zálohování, nikoli na CFixedStringMgr
sebe sama. K tomu dochází, protože každá instance CFixedStringMgr
může být přidružena pouze k jedné instanci CStringT
. Všechny další instance pokusu CStringT
o klonování správce by měly místo toho získat správce zálohování. Důvodem je to, že správce zálohování podporuje sdílení.
Implementace CFixedStringMgr::GetNilString
Implementace CFixedStringMgr::GetNilString
vrátí pevnou vyrovnávací paměť. Vzhledem k jednorázové korespondenci CFixedStringMgr
a CStringT
, daná instance CStringT
nikdy nepoužívá více než jednu vyrovnávací paměť najednou. Proto řetězec nil a skutečná vyrovnávací paměť řetězců nejsou nikdy potřeba ve stejnou dobu.
Kdykoli se pevná vyrovnávací paměť nepoužívá, CFixedStringMgr
zajistí, že se inicializuje s nulovou délkou. To umožňuje použití jako řetězec nil. Jako přidaný bonus nAllocLength
je člen pevné vyrovnávací paměti vždy nastaven na plnou velikost pevné vyrovnávací paměti. To znamená, že CStringT
může růst řetězec bez volání IAtlStringMgr::Reallocate, i pro nil řetězec.
Požadavky
Hlavička: cstringt.h