Wpis z mikrobloga

Elo programujące w C++ świry, może ktoś zweryfikować czy dobrze rozumiem jak działa metoda pushback() dla wektora? Dla N elementów wektora alokowany jest blok pamięci o rozmiarze k * N (k > 1), używanie pushback powoduje zapisywanie nowych elementów na tym bloku, a jeśli całkowity rozmiar elementów miałby przekroczyć rozmiar zaalokowanego bloku pamięci, to alokowany jest nowy blok o rozmiarze k * N i "stare" elementy są do niego kopiowane, tak?
#programowanie #naukaprogramowania #cpp
  • 15
@nienawidzejanka: @Razi91:

No nie bardzo, vector przechowuje jeszcze np. swoj rozmiar, czyli allocowane jest wiecej niz N * k. No i pozniej tez nie jest alokowany nowy blok k*N + ten stary. Bo to zalezy od kompilatora, moze byc tak ze nowy obszar jest 2 razy wiekszy, ale nie musi. TAk samo stara czesc nie musi byc przeniesiona bo moze byc miejsce obok niej.

Idea jest ok.
@FortunaHej: dlatego dałem kod, żeby można było samemu sprawdzić. GCC i clang się tak samo zachowują. Generalnie trzeba założyć że jest kopiowanie, tzn. ogarnąć konstruktory kopiujące
dlatego dałem kod, żeby można było samemu sprawdzić.


@Razi91: To jest jeden przyklad, jakby sie nie skopiowalo to zalozylbys ze sie nie kopiuje?

GCC i clang się tak samo zachowują.


@Razi91: Uzywaja nawet innych funkcji do alokacji i kopiowania. Zachowuja sie inaczej. Nie wiem jak z domyslnymi wartosciami rozszerzania.
@FortunaHej:

To jest jeden przyklad, jakby sie nie skopiowalo to zalozylbys ze sie nie kopiuje?

nie, ale ten przykład obrazuje, że to się dzieje, co jest wystarczającym powodem by go zamieścić.

Uzywaja nawet innych funkcji do alokacji i kopiowania. Zachowuja sie inaczej. Nie wiem jak z domyslnymi wartosciami rozszerzania.

Efekt ten sam (standard), pod spodem to bywa inaczej nawet między wersjami kompilatora.
@FortunaHej: zwiększanie rozmiaru zaalokowanego obszaru dla wektora razy dwa prowadzi do problemów alokacji lub dziur w pamięci (nb rosnących wraz z wektorem).

Po prostu alokując 2*k*N masz zamrożone 1*k*N + 0.5*k*N + 0.25*k*N.... = prawie 2*k*N z poprzednich alokacji. Ponadto nowa alokacja musi nastąpić przy największym obszarze nadal zaalokowanym by móc przenieść/przekopiować dane. Zwiększając rozmiar bufora nie masz szans użyć obszaru z poprzednich alokacji.

Lepszym rozwiązaniem jest zwiększanie obszaru np. razy