2009-10-29 12 views
17

Jeśli std :: vector i przyjaciele są self zmiana rozmiaru, to znaczy, jeśli Oświadczam wektor tak:kontenery STL na stosie i sterty

std::vector<string> myvec; 

Potem jego rozmiar przy użyciu bardziej stos, natomiast :

std::vector<string> *myvec = new std::vector<string>(); 

Czy zmieniłaby rozmiar, używając więcej sterty?

+2

Możesz również zaimplementować wektor o ustalonym rozmiarze, aby zachować to wszystko na stosie. Działa całkiem dobrze i może być optymalizacją. Koszt jest jednak taki, że nie będzie on nieskończenie rozszerzalny - będziesz musiał zadowolić się wysokim limitem i zawsze pochłonie tyle miejsca. –

+0

To ciekawe, więc wektor "o stałej wielkości" jest w całości na stosie? – Benj

+1

Nie znam wektora o stałym rozmiarze, ale jeśli chcesz mieć stałe dane na stosie, rozważ użycie std :: tr1 :: array, które wydaje się podobne. – stefaanv

Odpowiedz

24

Wektory przydzielają na stercie w swoich elementach wewnętrznych.

Jedyne, za co płacisz w stosie za bota stosowego, to kilka bajtów, bufor wewnętrzny zawsze będzie przydzielany ze sterty.

Tak skutecznie, gdy robisz vec = nowy wektor(), alokujesz niewielką ilość, która może nie być naprawdę dobra.

+0

Ah ok, więc czy wektory zadeklarowane na stosie usuwają pamięć, której użyli, gdy już wykraczają poza zasięg? – Benj

+0

@Benj: Tak, wyczyszczą pamięć, gdy wyjdą poza zakres. – Naveen

+6

@Benj: zwróć uwagę, że wektory czyszczą tylko pamięć, którą sami przydzielili. Jeśli dodasz obiekty z przydzielonymi stertami (z "nowym") do wektora, to jesteś odpowiedzialny za wywoływanie "usuń" na nich. Może już to wiedziałeś, ale chciałem o tym wspomnieć na wszelki wypadek ... – StackedCrooked

1

std :: wektor zawsze ma swój bufor przydzielony na stercie. Więc niezależnie od tego, gdzie jest przydzielony sam wektor, zmiana rozmiaru wpłynie tylko na stertę.

8

W pierwszym przypadku tworzysz wektor na stosie. Nie znaczy to, że wszystkie wewnętrzne obiekty wektorów są również na stosie. W rzeczywistości wektor nadal będzie alokował pamięć wymaganą do przechowywania obiektów na stercie. Dzieje się tak, ponieważ aby przydzielić na stos, powinieneś wiedzieć, ile obiektów utworzyć. Ale ta informacja nie jest dostępna, więc jedyną pozostałą opcją jest przydzielenie pamięci dla zawartego obiektu z sterty.

+0

Należy również zauważyć, że często std :: string zachowuje niektóre z wewnętrznych "obiektów" na stosie. Właściwie to zabronione jest std :: vector? –

Powiązane problemy