• Nie Znaleziono Wyników

5.3 Menad»er zasobów

5.3.2 U hwyty , klu ze

Najprostszymrozwi¡zaniemwydajesiby¢umo»liwienie dostpudozasobu poprzezreferen je zte» wska¹nikdoniego.Niestety,nie jestto bezpie zne, gdy»istniejeryzyko,»estan¡sioneniewa»ne.Takasytua jamo»ewyst¡pi¢ np.wów zas,gdyzasóbzostaªju»usunity,apotemponowniestworzony.Nie jestmo»liwawewntrznareorganiza japami imenad»erazasobów,bowiem przeniesieniedany hpowodujebaªaganwreferen ja hlubwska¹nika h. Roz-wi¡zaniemtegoproblemujestdodaniewarstwyabstrak jiwdostpiedo zaso-bu,by nieu»ywa¢referen jilub wska¹ników,za± aªy i»arzarz¡dzania re-feren jamiprzenie±¢namenad»erzasobów.

Celtenmo»nazrealizowa¢nawielesposobów.Bardzopopularnejest odwo-ªywaniesidozasobówzapomo ¡klu zatekstowego- zyliina zejmówi¡ za pomo ¡jegonazwy.Nazwazasobuprze howywanajestjakoªa« u hznaków zawieraj¡ y± ie»kdopliku,zktóregozasóbjeststworzony.

Abydosta¢wska¹nikdozasobu,nale»ywywoªa¢odpowiedni¡metodz me-nad»erazasobów:

CResour e* Cresour eManager::GetResour e( on st har *pszResName);

Listing5.3-1-Pobieraniewska¹nikadozasobu

Nazwamusisizgadza¢o zywi± iezt¡podan¡pod zastworzeniazasobu. Je±lizasóbnieistnieje,poniewa»niezostaªstworzonylubzostaªju»zwolniony, bardzoªatwomo»natenbª¡dwy hwy i¢i wodpowiedni sposób zareagowa¢, naprzykªadw zytuj¡ zasóbzpliku.

Wad¡klu zytekstowy hjesti hrozmiar.Zaka»dymrazem,gdy dokony-wanajesttransla jaznazwynazasób,konie znejestprzeanalizowanie aªego

i¡guznaków.Dodatkowokopiowanieªa« u hówznakówjestu i¡»liwe zarów-noje»eli hodziopami¢,jakio zaswykonania.

Tabli e haszuj¡ e

Doszybkiejtransla ji ªa« u haznakowegonawska¹nikbardzo zstostosuje si tabli e haszuj¡ e. Tabli a haszuj¡ a jest to struktura dany h sªu»¡ ado prze howywaniadany hw taki sposób, abymo»liwy byªdo ni h szybki do-stp przyu»y iu klu zy. Tabli e haszuj¡ e bardzo zsto opierasi na zwy-kªy h tabli a h indeksowany h li zbami. Ka»d¡ dan¡w tabli y identykuje klu z,którymo»e by¢naprzykªad i¡giemznaków.Klu zemmo»e by¢ rów-nie» ka»dy inny obiekt pod warunkiem, »e na jego podstawie mo»liwe jest wyzna zenie indeksu. Do wyzna zaniaindeksu w tabli y sªu»y funk ja mie-szaj¡ a.O zywi± iejestonaspe y znadladanegotypu klu za.Wa»nejest, abydla takiegosamegoklu za zawszewygenerowaªadokªadnietaki sam in-deks. Funk ja mieszaj¡ a powinna by¢prosta, aby zas li zenia indeksu nie zdominowaª zasu wyszukiwania obiektu, jednak powinna dla ró»ny h klu- zy generowa¢ maksymalnie ró»ne indeksy. O zywi± ie nie zawsze jest mo»-liwe,abydlaka»degokolejnegoklu zawygenerowa¢unikalnyindekszzakresu od zera dorozmiaru tabli y. Gdyfunk ja mieszaj¡ a wygeneruje indeks ju» zajty przez inny klu z, wystpuje kolizja. Stosunek li zby kolizji do li zby wszystki h wygenerowany h indeksów informuje o skute zno± i funk ji ha-szuj¡ ej. Aby stworzy¢doskonaª¡ funk jhaszuj¡ ¡, zyli tak¡, któranigdy niespowodujekolizji,konie znajestznajomo±¢wszystki hmo»liwy hklu zy. O zywi± ie stopie«komplika ji takiejfunk ji jest odwrotnie propor jonalny donadmiarowo± irozmiarutabli y.Przewa»nie zaswykonania funk ji mie-szaj¡ ejjestwa»niejszy,ni»jejwysokaskute zno±¢.Kolizjemo»narozwi¡za¢ nawielesposobów.Naj z± iejstosowane to:

Tabli alist -sposóbtenpoleganaprze howywaniuelementównie bezpo±-redniowtabli y,alewlista h(lubwektora h),któres¡zawartewtabli y. Gdywystpujekolizja,listapod danym indeksemwydªu»asi.

Przyrostindeksu -gdynastpujekolizja,elementwstawiasiwpodinnym indeksem, wyzna zonym zapomo ¡ funk ji przyrostuindeksu. Paramet-remfunk jijestindekswygenerowanyprzezfunk jmieszaj¡ ¡.Czsto sto-sujesifunk jliniow¡lubkwadratow¡.

Naponi»szejilustra jizaprezentowanes¡dwiewy»ejomówione implementa- je tabli y haszuj¡ ej. Polewej stronie wido znajest tabli a list, natomiast poprawejstronieznajdujesitabli a,któraradzisobiezkolizjamizapomo ¡ przyrostuindeksuojeden.Ilustra japrezentujejakwygl¡daj¡obietabli epo wstawieniukolejnosiedmiuelementów,który hwarto± iindeksówwyli zone przez funk jehaszuj¡ ¡ wynosz¡odpowiednio 6,0,9, 0,2, 9.Wprzypadku ty helementówpojawiaj¡sitrzyelementy,któremaj¡warto±¢0idwa, któ-remaj¡warto±¢dziewi¢.Indeksy,dlaktóry hwystpujekolizja,zazna zono

Rysunek5.1.Rozwi¡zywaniekolizji wtabli ymieszaj¡ ej

krzy»ykiem.Dlaelementówoindeksie0kolizjawyst¡piªadwarazy,adla ele-mentówoindeksierównym9jedenraz.Listywydªu»aj¡sinaskutekkolizji. Dlategowtabli ypodindeksem0znajdujesitrójelementowalista,apod in-deksem9listaodwó helementa h.Dlaindeksów2i6listyzawieraj¡tylkopo jednym elemen ie. Pozostaªelistys¡ puste.Drugaimplementa jareagujena kolizjeprzezznalezieniepierwszegowolnegomiejs awtabli ydla koliduj¡ e-goelementu.Pierwszakolizjawystpujedlaelementuoindeksiezero.Kolejne miejs ewtabli yjestwolnewi elementzostajeumiesz zonypodindeksem owarto± i1.Wprzypadkunastpnejkolizjidlaelementuoindeksierównym0 algorytmposzukujemiejs awtabli ydªu»ej,poniewa»miejs apodindeksami 1i 2s¡ ju» zajteprzez inne elementy. Pierwsze,wolnemiejs eznajduje si podindeksemnumer3.

Obydwarozwi¡zaniamaj¡swojewadyizalety.Pierwszerozwi¡zaniemo»e by¢wolniejszepod zasdodawaniaobiektów,gdy»wprzypadkukoniktu ko-nie znamo»eby¢realoka japami i.Bdzieonozatonaogóªszybszepod zas usuwaniaorazznajdowaniaobiektów,gdy»naskutekkolizjiniejestpotrzebne wywoªywanie funk ji przyrostu. Za drugim rozwi¡zaniem mo»e przemawia¢ prostotaimplementa ji,jednakwad¡jestto,»e tabli amusilepiejmie¢ dob-ranyrozmiarpo z¡tkowy.

Dobórrozmiarutabli yhaszuj¡ ejjesttematemwieluopra owa«.Istnieje rozmiaridealny-taki,»edlaka»degomo»liwegoklu zaistniejepolewtabli y,

bdzie 4bajtowym i¡giemznaków( zyli bardzo krótki -zazwy zaj stosuje siklu zeowieledªu»sze),tabli amusiaªabymie¢rozmiar4gigabajtów:

n =

4

X

i=1

256i= 4311810304

Przyjªosi,»e rozmiartabli ypowinienby¢wikszyod maksymalnejli zby elementówojakie±25-30%orazpowinienby¢li zb¡pierwsz¡.Kolejnym pro-blemem jest dobór funk ji mieszaj¡ ej. Optymalna funk ja mieszaj¡ a dla ka»dego kolejnego klu za powinna wygenerowa¢ inny indeks - wtedy nigdy niewyst¡piªybykonikty.Wprakty efunk jzazwy zajwybierasi empiry- znie dlakonkretny hdany h,abykoniktywystpowaªymo»liwierzadko.

Implementa janieskomplikowanejtabli yhaszuj¡ ejjestrelatywnie pros-ta. Podstaw¡jestinterfejsklu za.

lass IHashTableKey {

publi :

virtual ~IHashTableKey(){}; //! Returns key hash ode.

virtual unsigned int GetHashCode() = 0; //! Che ks if other key is equal.

virtual bool IsEqual( onst IHashTableKey\& other) = 0; };

Listing5.3-2-Interfejsklu zatabli yhaszuj¡ ej

Interfejsdlaklu zyskªadasizdwó h metod. Pierwszazni h, GetHash-Code,zwra awarto±¢poli zon¡poprzezfunk jmieszaj¡ ¡.Druga,IsEqual, sªu»ydoporównywaniadwó hklu zy.Zwra atrue,gdyklu zes¡takiesame. Metodatajestbardzowa»na.Wykorzystywanajestdosprawdzania, zy tabli- azawieraju»obiektotakimklu zu.Jestonawywoªywanapod zas wstawia-nia,wydobywaniaobiektuztabli y orazpod zasjegousuwania.

Klasaklu zazbudowanegozªa« u haznakówwygl¡danastpuj¡ o:

lass CStringKey : publi IHashTableKey {

private:

CString m_strKey;

unsigned int m_iHashCode;

publi :

//! Constru ts and initialize key.

CStringKey( onst har *pszKey,unsigned int iHashTableSize) : m_strKey(pszKey)

{

Cal ulateHashCode(iHashTableS ize); }

//! Returns key hash ode.

virtual unsigned int GetHashCode(){return m_iHashCode;} //! Che ks if other key is equal.

virtual bool IsEqual( onst IHashTableKey& other) {

returnm_strKey.IsEqual((( onst CStringKey &)other).m_strKey); }

};

Listing5.3-3-Klasaklu zazbudowanegozªa« u haznaków

Ša« u hznakówwobiek ie klasyCStringzapisywanyjestw konstrukto-rze. Li zonyjestte» indeksza pomo ¡ prywatnejfunk ji mieszaj¡ ej Cal u-lateHashCode.MetodaGetHashCodezwra aw ze±niejpoli zonyindeks. Me-todaIsEqualzwra aprawd,gdyklu zezawieraj¡takisamªa« u hznakowy.

Przykªadowafunk jahaszuj¡ amo»ewygl¡da¢nastpuj¡ o:

CStringKey::Cal ulateHashCode( iHas hTabl eSize ) {

unsigned int iResult;

unsigned int iLen = m_strKey.GetLenth(); for (int i = 0; i < iLen; i++)

{

har Letter = strKey[i℄;

iResult += (unsigned int) Letter * Pow(31,(iLen-i)); }

m_iHashCode = iResult % iHashTableSize; }

Listing5.3-4-Metodaimplementuj¡ afunk jhaszuj¡ ¡

U hwyty

Inny sposobem odizolowania si od wska¹ników lub referen ji s¡ u hwyty. U hwytjesttoobiekt prze howuj¡ yinforma jepotrzebnedowydoby ia za-sobuzmenad»era.Obiekttenpomimotego,»ejestbardzomaªy,jest

wystar--dziki zemuªatwomo»nagokopiowa¢orazwbardzoszybkisposób identy-kowa¢powi¡zanyznimzasób.

lass CHandle { private: int m_iIndex; int m_iMagi Number; publi :

CHandle( onst CHandle& other) : m_iIndex(other.m_iIndex),

m_iMagi Number(other.m_iMagi Numbe r) {}

CHandle(int iIndex,int iMagi Number) : m_iIndex(iIndex),

m_iMagi Number(iMagi Number) {}

bool operator ==( onst CHandle& other) {

return (m_Index == other.m_iIndex &&

m_iMagi Number == other.m_iMagi Number); }

CHandle& operator =( onst CHandle& other) { m_iIndex = other.m_iIndex; m_iMagi Number = other.m_iMagi Number; return *this; } };

Listing5.3-5-Klasau hwytu

U hwytskªadasizdwó hpól:

Indeksuzasobu,którywjednozna znysposóbpozwalamenad»erowi zaso-bówokre±li¢lokaliza jezasobuwpami i.Warto±¢indeksuokre±laindeks wtabli y lubnali± iezasobówznajduj¡ ejsiwmenad»erzezasobów.

Magi znejli zby,którapozwalawjednozna znysposóbokre±li¢, zy u h-wytjestaktualnyi zydoty zyistniej¡ egowpami izasobu.Jestona ge-nerowanaprzezmenad»erzasobówpod zastworzenianowegozasobu.Jej

abybyªamo»liwieunikalna.Bardzoprostym, ajedno ze±nieskute znym sposobem, jest przypisywaniemagi znej li zbie warto± ilosowej. Istnieje znikome prawdopodobie«stwowylosowaniadwukrotnie 32 bitowej li zby w zasietrwaniaprogramu.

Opró z tegou hwyt skªadasizkonstruktorakopiuj¡ egooraz prze i¡»one-go operatoraprzypisania,dzikiktórymu hwytw ªatwysposób sikopiuje. Za pomo ¡ prze i¡»onego operatora równo± i mo»na szybkoporówna¢ dwa u hwyty.

Zasobytworzysizapomo ¡metody:

CHandle& Cresour eManager::CreateReasou r e( onst har *pszResName);

Listing5.3-6-Tworzeniezasobów

Pod zastworzenianowegozasobutworzonyjestnowyu hwyt,który prze- howuje pierwszy wolny indeks w tabli y wska¹nikówna stworzenie zasobu iwylosowan¡magi zn¡li zb.U hwytzostajezwró onyprzezfunk j tworz¡- ¡zasób.Menad»erpoutworzeniuzasobuzapamitujepodwybranym w ze±-niejindeksemwtabli ywska¹nikówwska¹nikdoniego,awtabli ymagi zny h li zbprzypisan¡mumagi zn¡li zb.

Pod zaspobieraniazasobuzmenad»erazapomo ¡metody:

CResour e* Cresour eManager::GetResour e( on st CHadle& handle);

Listing5.3-7-Pobieraniezasobu

Menad»erwpierwszejkolejno± isprawdza, zyistniejezasóbpodindeksem prze howywanym wu hwy ie, anastpniewerykuje magi zneli zby.Je»eli magi znali zbazu hwyturo»nisiodtejzmenad»era,ozna zato,»eu hwyt niejestju» wa»ny.Sytua jatakamo»ewyst¡pi¢wtedy,kiedyzasóbzwi¡zany zpodanymu hwytemzostaªju»zwolniony,awjegomiejs ezostaªutworzony nowyzasób.

Podsumowanieu hwytów i klu zy

Wydobywaniezasobówzapomo ¡u hwytówjestbardzo szybkie,gdy» spro-wadzasidoweryka jimagi znejli zbyorazewentualnegozwró eniazasobu. Klu ze s¡ wolniejsze, poniewa» za ka»dym razem podany ªa« u h znakowy musi zosta¢ przeanalizowanyw elu obsªu»enia tabli y haszuj¡ ej.Za to i h

Obusposobówmo»nau»ywa¢przemiennie-staraj¡ sijednakw kryty z-ny h momenta h wykorzystywa¢u hwyty,poniewa»s¡ szybsze.Dobr¡ prak-tyk¡jeststosowanieklu zywfunk ja hini jaliza yjny h,abypobra¢u hwyt, który nastpniewykorzystywanyjestw funk ja h wykonywany h ykli znie. Dzikitakiemupodej± iukodjestªatwydointerpreta jiprzezprogramistido tegowystar zaj¡ oszybki.

Zarównoklu ze,jakiu hwytymaj¡nastpuj¡ ¡przewagnad bezpo±red-nimdostpemprzezwska¹nik zyreferen je:

Šatwomo»nasprawdzi¢i hpoprawno±¢.

Dodatkowypoziomabstrak jipozwalanareorganiza jedany hwpami i.

Uªatwiaj¡zapisorazod zytzdysku.

Powiązane dokumenty