лекции (2008) (by Kravets) (укороченное) (1160827), страница 17
Текст из файла (страница 17)
Íî â interface ìîæíî îïèñàòü íå òîëüêî ìåòîäû.Òàê æå ó êàæäîãî ìîäóëÿ ïðèñóòñòâóåò èíèöèàëèçàöèîííàÿ è ôèíàëèçèðóþøùàÿ ÷àñòü, êîòîðûå âûïîëÿíþòñÿ ñîîòâåñòâåííî ïðè âõîäå è âûõîäÿ èç ìîäóëÿ. Ñ++ íå ñáîðêè ìóñîðà, â åãî ðåàëèçàöèè â ñèñòåìå .NET îíà ïðèñóòñòâóåò, íî â ñòàíäàðòå åãî íåò.Âûçîâ êîíñòðóòêðà îáÿçàòåëüíî ïðèâÿçûâàåòñÿ ê èíèöèàëèçàöèè è âûçîâ äåñòðóêòîðà - ê óäàëåíèþ.Âàæíàÿ ÷åðòà Ñ++ - ñâåðòêà ñòåêà, ÷òî ãàðàíòèðóåò âûçîâ äåñòðóêòîðîâ äëÿ ëîêàëüíûõ îáúåêòîâ.RAII - Ïðèîáðåòåíèå ðåñóðñà is initialisationÅñëè êëàññ çàõâàòûâàåò ðåñóðñû - òî êîíñòðóêòîð - ýòî çàõâàò, äåñòðóêòîð - îñâîáîæäåíèå.  Ñ++ åäèíñòâåííàÿ âîçìîæíîñòü óòå÷êè ïàìÿòè - ðàáîòà ñ äèíàìè÷åñêîé ïàìÿòè. C# è Java åñòü ñáîðêà ìóñîðà, íî äëÿ íåå íåò óíèâåðñàëüíîãî ýôôåêòèâíîãî àëãîðèòìà. Ïåðâûé âàðèàíò àëãîðèòìà - ñ÷åò÷èê ññûëîê. Òàêàÿ ìåòîäèêà î÷åíü ïðîñòà, íî îíà íåêîððåêòíî ðàáîòàåò íà êîëüöåâûõññûëêàõ.Äðóãàÿ ìåòîäèêà - Mark And Sweep.
Åãî íåäîñòàòîê - âîçìîæíà âíåçàïíîå íåóïðàâëÿåìîå çàìåäëåíèåïðîãðàììû (â ëþáîé ìîìåíò ìîæåò âêëþ÷èòüñÿ ñáîðêà ìóñîðà). Ñ++ ïðîáëåìà ïðè ðàáîòå ñ ïàìÿòüþ - ôðàãìåíòèðîâàíèå ïàìÿòè. M&S ïîçâîëÿåò èçáåæàòü ôðàãìåíòàöèè, íî îí ìåíÿåò àäðåñ îáúåêòà.Íî ýòî íå åäèíñòàâåííàÿ ïðîáëåìà ýòîãî àëãîðèòìà.  C# è Java âûçîâäåñòðóêòîðà âîîáùå íå ãàðàíòèðîâàí, òàê êàê îí âûçûâàåòñÿ òîëüêî ïðè óíè÷òîæåíèè îáúåêòà, òî åñòü êîãäàíå õâàòàåò äèíàìè÷åñêîé ïàìÿòè.Ñáîðêà ìóñîðà íå ïîçâîëÿåò ÿâíî êîíòðîëèðîâàòü î÷èñòêó ðåñóðñîâ.
 êëàññå object åñòü protected ìåòîäprotected void nalise ();Ñåé÷àñ ñáîðêà ìóñîðà - ïàðàëëåëüíûé ïîòîê ñ íèçêèì ïðèîðèòåòîì.if (!close) closed ();Òàê äîëæåí âûãëÿäåòü ìåòîä nalise. Ñ# âñå åùå õóæå.  Ñ# ïîçâîëÿåòñÿ ïèñàòü äåñòðóêòîð, ïðè÷åì ñèíòàêñèñ åãî òî÷íî òàêîé æå êàê è âÑ++, íî ðàáîòàåò îí íå òàê.  äåñòðóêòîðå âûçûâàåòñÿ ìåòîä ìåòîä nalise êëàññà object. Òî åñòü äåñòðóêòîðÿïî ñóòè ÿâëÿåòñÿ òåì æå ôèíàëèçàòîðîì. Java ìåòîä î÷èñòêè ðåñóðñîâ ëèáî âûçûâàåòñÿ ÿâíî, ëèáî â ôèíàëèçàòîðå.c = new X();// çàõâàò ðåñóðñàtry {return;}finally {c.close ();//î÷èñòêà ðåñóðñîâ}Ïðè ýòîì nally - ýòî íå ëîâóøêà. Ñ# ââåëè âïåöèàëüíûé èíòåðôåéñ - IDisposible, êîòîðûé ñîñòîèò èç åäèíîãî ìåòîäà void Dispose (),êîòîðûé ãîâîðèò, ÷òî îáúåêò íå îáÿçàòåëüíî ôèíàëèçèðîâàòü, çàìåùàÿ ñîáîé ôèíàëèçàöèþ.using ( Image im = Imaj.FromFile ()){//...}Òåïåðü ïîñëå using áëîêà âûçîâóòñÿ ìåòîäû dispose äëÿ âñåõ îáúåêòîâ èç using áëîêà (êîòîðûé (Image im =Imaj.FromFile ())) Java åñòü äâà âèäà ññûëîê.
Ñèëüíàÿ ññûëêà - îáû÷íàÿ ññûëêà, ñëàáàÿ ññûëêà:WeakReferenceObject getReference ();Ñëàáûå ññûëêè - ññûëêè íà óæå îñâîáîæäåííóþ ïàìÿòü ñ òî÷êè çðåíèÿ ïðîãðàììèñòà, íî ïàìÿòü åùå íåîñâîáîæäåíà. getReference äëÿ ñëàáîé ññûëêè "ðåàíèìèðóåò"îáúåêò.Ïðèìåð - êåø áðîóçåðà, ïðè ïåðåõîäå íà ñëåä ñòðàíèöó òðåáóåòñÿ îñâîáîäèòü êåø áðîóçåðà. Ññûëêàìíà íèõ ïðèñâàèâàþòñÿ íóëè è îíè ïåðåõîäÿò â ðàçðÿä ñëàáûõ ññûëîê.
Åñëè âåðíóòüñÿ íàçàä, òî âìåñòîçàïðàøèâàèÿ ðåñóðñîâ ïîâòîðíî ìîæíî ðàññìîòðåòü î÷åðåäü ñëàáûõ ññûëîê è ïîïðîáîâàòü äîñòàòü îáúåêòû.Åñëè îáúåêò íåäîñòóïåí, òî ïðîñòî âåðíåòñÿ null.Èòàê, ìû ïîëó÷àåì ìåõàíèçì êåøèðîâàíèÿ ðåñóðñîâ.63Ïóíêò 4. Äîïîëíèòåëüíûå ïðîáëåìû, ñâÿçàííûå ñ òèïàìè.- êîïèðîâàíèå, ñðàâíåíèå- íåÿâíûå ïðåîáðàçîâàíèÿÏðîáëåìà êîïèðîâàíèÿ è ñðàâíåíèÿ îáúåêòà - ìîãóò îòëè÷àòüñÿ îò ñòàíäàðòíûõ îïåðàöèé êîïèðîâàíèÿèëè ñðàâíåíèÿ. Êàê ñðàâíèâàòü è ìîæíî ëè îãðàíè÷èòüñÿ ïðîñòûì ïî÷ëåííûì êîïèðîâàíèåì. Îòñþäà 2ïîíÿòèÿ - ãëóáîêîå êîïèðîâàíèå è ïîâåðõíîñòíîå êîïèðîâàíèå. Deep copy è shallow copy.Íà âîïðîñ î òîì, êàê èìåííî êîïèðîâàòü ìîæåò îòâåòèòü òîëüêî ïðîãðàììèñò.  Ñ++ ñòàíäàðòíîå ïîâåðõíîñòíîå êîïèðîâàíèå.
 äðóãèõ ÿçûêàõ ñòàíäàðòíîå ïðèñâàèâàíèå - ïîâåðõíîñòíîå êîïèðîâàíèå.  C#è Java åñòü ìåòîäû clone ().  îáîèõ ÿçûêàõ åñòü ñïåöèàëüíûé èíòåðôåéñ Icloneable.Ñ Ñ# â êëàññå Object åñòü ìåòîä MemberwiseClone (), ðåàëèçóþùèé ïîâåðõíîñòíîå ïî÷ëåííîå êîïèðîâàíèå, ÷òîá èçáåæàòü ýòîãî îáúåêò äîëæåí ðåàëèçîâûâàòü èíòåðôåéñ ICloneable, â êîòîðîì äîëæåí áûòü ìåòîäclone ().64Ëåêöèÿ 2425.11.2008Ðàññìîòðèì ÿçûê Delphi - òàì íàèáîëåå ïðîñòàÿ ñèòóàöèÿ.
Òàì íàñëåäóþòñÿ êîíñòðóêòîðû è äåñòðóêòîðû.Áîëåå òîãî, îíè âñåãäà âûçûâàþòñÿ ÿâíî, òî åñòü òàì íåò îñîáûõ ôîðì êîíñòðóêòîðîâ.type X = classconstructor load;destructor Destroy;end;Åñëè êîíñòðóêòîðîâ èëè äåñòðóêòîðîâ íåò, òî îíè íå ñîçäàþòñÿ. Òàê êàê êîíñòðóêòîðû íàñëåäóþòñÿ, òîâñå îáúåêòû èìåþò êîíñòðóêòîð create è äåñòðóêòîð destroy. Êîãäà âûçûâàåòñÿ êîíñòðóêòîð, ìû óâåðåíû÷òî òàáëèöà âèðòóàëüíûõ ìåòîäîâ èìååò êîððåêòíûé âèä (â Ñ++ ýòî íå òàê).Èòàê êîíñòðóêòîðû è äåñòðóêòîðû íàñëåäóþòñÿ íî íå ãåíåðèðóþòñÿ. Íèêàêèõ êîíñòðóêòîðîâ óìîë÷àíèÿíåòó è äëÿ âûçîâà êîíñòðóêòîðà áàçîâîãî êëàññà òðåáóåòñÿ âûçûâàòü åãî ÿâíî. Äëÿ ýòîãî ñëóæèò ñïåöèàëüíîå êëþ÷åâîå ñëîâîinherited - Delphisuper - javabase - C# Delphi äëÿ âûçîâà êîíñòðóêòîðà áàçîâîãî êëàññà òðåáóåòñÿ ïåðâûì îïåðàòîðîì â îáúåêòå íàïèñàòüinherited Create.
Ïðè ýòîì ýòî äîëæåí áûòü èìåííî ïåðâûì îïåðàòîðîì â êîíñòðóêòîðå, òàê êàê êîíñòðóêòîðcreate çàáèâàåò îáúåêò íóëÿìè. Äëÿ ïîëó÷åíèÿ ðàçìåðà îáúåêòà, create èñïîëüçóåò âèðòóàëüíóþ ôóíêöèþïîëó÷åíèÿ ðàçìåðà îáúåêòà.Âàæíî ÷òî èìÿ îáúåêòà íå èñïîëüçóåòñÿ, òî åñòü ïðè ñìåíå èìåíè íå òðåáóåòñÿ ïåðåïèñûâàòü íàñëåäóåìûéêëàññ. Delphi íåò àâòîìàòè÷åñêîé ñáîðêè ìóñîðà â îáùåì âèäå, íî ïðè ðàáîòå ÷åðåç ñòàíäàðòíûå èíòåðôåéñûîíà ìîæåò áûòü. Ýòî ïðèâîäèò ê òîìó, ÷òî ïðîãðàììû íà Delphi Ïðîâîöèðóþò áîëüøîå ÷èñëó óòå÷åê ïàìÿòè.var a: X;a := X.create;a := X.Create (1);a.Free; - íå äåñòðóêòîð, íî óíè÷íîæåíèå îáúåêòà, êîòîðûé ìîæåò âûçûâàòü äåñòðóêòîð.Äåñòðóêòîð íå òðåáóåòñÿ ÿâíî âûçûâàòü ÿâíî, òàê êàê ôóíêöèÿ Free íå òîëüêî âûçûâàåò äåñòðóêòîð, íîè âûçûâàåò ìåíåäæåð ïàìÿòè äëÿ î÷èñòêè.
Òàê êàê ôóíêöèÿ íå ìîæåò ìåíÿòü çíà÷åíèå self, òî âûçîâ Freeíå ìîæåò èíèöèàëèçèðîâàòü a := nil.Ñòàòè÷åñêèå îáúåêòû Ñ++ âñå ñòàòè÷åñêèå îáúåêòû ñîçäàþòñÿ äî âûçîâà ôóíêöèè main. Ýòî åäèíñòâåííîå ÷òî èçâåñòíî ïðîíåãî.X a(0);X b(1);Âñå ÷òî èçâåñòíî, ýòî òî ÷òî a è b áóäóò ñîçäàíû äî âûçîâà main è óäàëåíû ïîñëå âûõîäà èç íåå. Íîïîðÿäîê èõ âûçîâà íå îïðåäåëåí.  îáùåì ñëó÷àå Ñ++ íå äàåò ñïîñîáîâ óïðàâëåíèÿ ïðîöåññîâ èíèöèàëèçàöèèñòàòè÷åñêèõ äàííûõ, è òðåáóåòñÿ èçîáðåòàòü äóðãèå ñïîñîáû. C# è Java âñå íåñêîëüêî èíà÷å.
 Java äëÿ îáúåêòà ìîãóò ñòîÿòü èíèöèàëèçàòîðû.class X{static Y a = new Y ();}//Javaclass X{static int []a;static {a = new int [N];for (int i = 0; i < N; i ++) a[i] = i;}}65 C# åñòü âîçìîæíîñòü ïðîñòîé ñòàòè÷åñêîé èíèöèàëèçàöèè, à òàê æå åñòü ñòàòè÷åñêèé êîíñòðóêòîð ïîëíûé àíàëîã ñòàòè÷åñêîãî áëîêà â Java. Ïðè ýòîì ýòî äîëæåí áûòü êîíñòðóêòîðîì ïî óìîë÷àíèþ. Delphi ñòàòè÷åñêèé îáúåêòîâ âîîáùå íåò. Íî â interface ìîæíî îïèñàòü íå òîëüêî ìåòîäû.Òàê æå ó êàæäîãî ìîäóëÿ ïðèñóòñòâóåò èíèöèàëèçàöèîííàÿ è ôèíàëèçèðóþøùàÿ ÷àñòü, êîòîðûå âûïîëÿíþòñÿ ñîîòâåñòâåííî ïðè âõîäå è âûõîäÿ èç ìîäóëÿ. Ñ++ íå ñáîðêè ìóñîðà, â åãî ðåàëèçàöèè â ñèñòåìå .NET îíà ïðèñóòñòâóåò, íî â ñòàíäàðòå åãî íåò.Âûçîâ êîíñòðóòêðà îáÿçàòåëüíî ïðèâÿçûâàåòñÿ ê èíèöèàëèçàöèè è âûçîâ äåñòðóêòîðà - ê óäàëåíèþ.Âàæíàÿ ÷åðòà Ñ++ - ñâåðòêà ñòåêà, ÷òî ãàðàíòèðóåò âûçîâ äåñòðóêòîðîâ äëÿ ëîêàëüíûõ îáúåêòîâ.RAII - Ïðèîáðåòåíèå ðåñóðñà is initialisationÅñëè êëàññ çàõâàòûâàåò ðåñóðñû - òî êîíñòðóêòîð - ýòî çàõâàò, äåñòðóêòîð - îñâîáîæäåíèå.
 Ñ++ åäèíñòâåííàÿ âîçìîæíîñòü óòå÷êè ïàìÿòè - ðàáîòà ñ äèíàìè÷åñêîé ïàìÿòè. C# è Java åñòü ñáîðêà ìóñîðà, íî äëÿ íåå íåò óíèâåðñàëüíîãî ýôôåêòèâíîãî àëãîðèòìà. Ïåðâûé âàðèàíò àëãîðèòìà - ñ÷åò÷èê ññûëîê. Òàêàÿ ìåòîäèêà î÷åíü ïðîñòà, íî îíà íåêîððåêòíî ðàáîòàåò íà êîëüöåâûõññûëêàõ.Äðóãàÿ ìåòîäèêà - Mark And Sweep. Åãî íåäîñòàòîê - âîçìîæíà âíåçàïíîå íåóïðàâëÿåìîå çàìåäëåíèåïðîãðàììû (â ëþáîé ìîìåíò ìîæåò âêëþ÷èòüñÿ ñáîðêà ìóñîðà). Ñ++ ïðîáëåìà ïðè ðàáîòå ñ ïàìÿòüþ - ôðàãìåíòèðîâàíèå ïàìÿòè. M&S ïîçâîëÿåò èçáåæàòü ôðàãìåíòàöèè, íî îí ìåíÿåò àäðåñ îáúåêòà.Íî ýòî íå åäèíñòàâåííàÿ ïðîáëåìà ýòîãî àëãîðèòìà.  C# è Java âûçîâäåñòðóêòîðà âîîáùå íå ãàðàíòèðîâàí, òàê êàê îí âûçûâàåòñÿ òîëüêî ïðè óíè÷òîæåíèè îáúåêòà, òî åñòü êîãäàíå õâàòàåò äèíàìè÷åñêîé ïàìÿòè.Ñáîðêà ìóñîðà íå ïîçâîëÿåò ÿâíî êîíòðîëèðîâàòü î÷èñòêó ðåñóðñîâ.  êëàññå object åñòü protected ìåòîäprotected void nalise ();Ñåé÷àñ ñáîðêà ìóñîðà - ïàðàëëåëüíûé ïîòîê ñ íèçêèì ïðèîðèòåòîì.if (!close) closed ();Òàê äîëæåí âûãëÿäåòü ìåòîä nalise. Ñ# âñå åùå õóæå.
 Ñ# ïîçâîëÿåòñÿ ïèñàòü äåñòðóêòîð, ïðè÷åì ñèíòàêñèñ åãî òî÷íî òàêîé æå êàê è âÑ++, íî ðàáîòàåò îí íå òàê.  äåñòðóêòîðå âûçûâàåòñÿ ìåòîä ìåòîä nalise êëàññà object. Òî åñòü äåñòðóêòîðÿïî ñóòè ÿâëÿåòñÿ òåì æå ôèíàëèçàòîðîì. Java ìåòîä î÷èñòêè ðåñóðñîâ ëèáî âûçûâàåòñÿ ÿâíî, ëèáî â ôèíàëèçàòîðå.c = new X();// çàõâàò ðåñóðñàtry {return;}finally {c.close ();//î÷èñòêà ðåñóðñîâ}Ïðè ýòîì nally - ýòî íå ëîâóøêà. Ñ# ââåëè âïåöèàëüíûé èíòåðôåéñ - IDisposible, êîòîðûé ñîñòîèò èç åäèíîãî ìåòîäà void Dispose (),êîòîðûé ãîâîðèò, ÷òî îáúåêò íå îáÿçàòåëüíî ôèíàëèçèðîâàòü, çàìåùàÿ ñîáîé ôèíàëèçàöèþ.using ( Image im = Imaj.FromFile ()){//...}Òåïåðü ïîñëå using áëîêà âûçîâóòñÿ ìåòîäû dispose äëÿ âñåõ îáúåêòîâ èç using áëîêà (êîòîðûé (Image im =Imaj.FromFile ())) Java åñòü äâà âèäà ññûëîê.
Ñèëüíàÿ ññûëêà - îáû÷íàÿ ññûëêà, ñëàáàÿ ññûëêà:WeakReferenceObject getReference ();Ñëàáûå ññûëêè - ññûëêè íà óæå îñâîáîæäåííóþ ïàìÿòü ñ òî÷êè çðåíèÿ ïðîãðàììèñòà, íî ïàìÿòü åùå íåîñâîáîæäåíà. getReference äëÿ ñëàáîé ññûëêè "ðåàíèìèðóåò"îáúåêò.Ïðèìåð - êåø áðîóçåðà, ïðè ïåðåõîäå íà ñëåä ñòðàíèöó òðåáóåòñÿ îñâîáîäèòü êåø áðîóçåðà. Ññûëêàìíà íèõ ïðèñâàèâàþòñÿ íóëè è îíè ïåðåõîäÿò â ðàçðÿä ñëàáûõ ññûëîê.