Sdílet prostřednictvím


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

Viz také

Správa paměti pomocí CStringT