🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: alt.pl.comp.lang.csharp
Article #909

Re: tablica dynamiczna :)

#909
From: Marek Janaszewski USUNTO. z adre...
Date: Mon, 12 Apr 2004 20:31
47 lines
3407 bytes
Aptu wrote:
> W wiadomości <c5e2hk$gee$1...@news.onet.pl>
> rozrabiak <br...@maila.pl> napisał(a):
>
>> No dobrze, a jak dodawac nowe indeksy do tej tablicy?
>> Np: w czasie pracy programu okaze sie, ze 100 elementow to za malo i
>> trzeba bedzie dodac 10. W Delphi uzywalem
>> SetLength(obiekt,Length(obiekt)+10) i mialem 10 elementow wiecej, a
>> jak to zrobic w C# ?
>
> Odpowiedź której sam udzieliłeś jest prawidłowa, może w Delphi można
> to zrobić inaczej ale w C# za dynamiczne tablice robią właśnie
> kolekcje.

Witam!

Tak tylko sposób alokacji takich danych jest zupełnie inny. Trochę głupio
mieć do danych prymitywnych takich jak int, double, itd w pamięci tablice
wskaźników (chyba coś takiego w C++ nazywane jest wektorem) a te dane
przydzielone dynamicznie. Zamiast tego tablica to spójny obszaru pamięci.
Tablica to tablica, elementy są organizowane przez sąsiedztwo. Ma to swoje
zalety i wady. Wady w operowaniu, zalety w spójności, oszczędności i łatwej
możliwości przejścia do n-tego elementu. Do obiektów kolekcje nadają się
znakomicie, no ale w tym celu opakowywać typ całkowite i zmiennoprzecinkowe
to może okazać się przesadą. W C# pozostawiono struktury i typy prymitywne
właśnie ze względu na wydajność.

Co do zmiany wielkości to trzeba zrobić to w taki sposób w jaki wykonało by
to Delphi. Założyć tablice o nowej wielkości i przepisać do niej wszystkie
dotychczasowe elementy. Aby nie dokonywać tego zbyt często warto dodawać
elementy w jakiś paczkach. Rozwiązuje się to przechowując pojemność tablicy
i ilość elementów osobno. Jeśli rozmiar próbuje przekroczyć pojemność
realokacja jest wykonywana. Tak działa w Delphi TList. Dodatkowo przyrost
elementów jest wyznaczany na podstawie wielkości tablicy. Im więcej
elementów tablica tym w większych kęsach warto aby się rozrastała. Jak
działa SetLength pod tym względem to nie wiem.

Jeśli do C# jest dostępne narzędzie do optymalizacji kodu to można coś
takiego poprosić o sprawdzenie naszego kodu. Jeśli nieopatrznie powodujemy
gdzieś działania kończone się masowym wywoływaniem menadżera pamięci, to
powinno coś takiego wyjść. Np. w jakieś pętli są dodawane elementy zawsze na
początek.

-- 
Pozdrawiam,
Marek Janaszewski
[ j_m...@gazeta.pl ]
Technical Details
Message-ID: <c5f0dk$msk$1@news.atman.pl>
Path: mbox-mo1.pugleaf.net!archiver1.google.com!news2.google.com!news.maxwell.syr.edu!newsfeed.icl.net!proxad.net!newsfeed.tpinternet.pl!news.atman.pl!not-for-mail
References: <c5bmeb$oe5$1@news.onet.pl> <c5bogj$s1b$1@news.onet.pl> <c5e1do$311c$1@news.atman.pl> <c5e2hk$gee$1@news.onet.pl> <u7jwl7yst.fsf@sygnatur.ce>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!archiver1.google.com!news2.google.com!news.maxwell.syr.edu!newsfeed.icl.net!proxad.net!newsfeed.tpinternet.pl!news.atman.pl!not-for-mail
From: "Marek Janaszewski \(USUN_TO. z adresu!\)" <USUN_TO...@gazeta.pl>
Newsgroups: alt.pl.comp.lang.csharp
Subject: Re: tablica dynamiczna :)
Date: Mon, 12 Apr 2004 22:31:34 +0200
Organization: ATMAN
Lines: 48
Message-ID: <c5f0dk$msk$1@news.atman.pl>
References: <c5bmeb$oe5$1@news.onet.pl> <c5bogj$s1b$1@news.onet.pl> <c5e1do$311c$1@news.atman.pl> <c5e2hk$gee$1@news.onet.pl> <u7jwl7yst.fsf@sygnatur.ce>
NNTP-Posting-Host: staticline702.toya.net.pl
Mime-Version: 1.0
X-Trace: news.atman.pl 1081804020 23444 217.113.228.127 (12 Apr 2004 21:07:00 GMT)
X-Complaints-To: use...@atman.pl
NNTP-Posting-Date: Mon, 12 Apr 2004 21:07:00 +0000 (UTC)
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit