Article View: alt.pl.comp.lang.csharp
Article #909Re: tablica dynamiczna :)
From: Marek Janaszewski USUNTO. z adre...
Date: Mon, 12 Apr 2004 20:31
Date: Mon, 12 Apr 2004 20:31
47 lines
3407 bytes
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-mailReferences:
<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