Wpis z mikrobloga

Kiedyś usłyszałem na jednym ze spotkań dla programistów, że przy implementowaniu dynamicznej tablicy w C zamiast podwajania pojemności przy dodawaniu gdy zabraknie miejsca lepszy jest wolniejszy przyrost np. 1,5 raza poprzednia pojemność. Może mi ktoś wyjaśnić, dlaczego jest to lepsze? Argumentem nie było oszczędzanie pamięci, tylko coś z fragmentacją i sposobem działania realloc().

#programowanie
  • 7
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Może mi ktoś wyjaśnić, dlaczego jest to lepsze? Argumentem nie było oszczędzanie pamięci, tylko coś z fragmentacją i sposobem działania realloc().


@jacekprim: Nie jest lepsze, tylko może być lepsze w odpowiednich warunkach.
I co do fragmentacji też się nie zgodze - bo jak żadasz mniejsze fragmenty to fakt, system musi dać ci mniejszy, wiec jest wieksza szansa, że taki będzie, ale potem zwalniasz tez mniejszy, przez co trudniej o ciagły,
  • Odpowiedz
@anonim1133: nie o czasy chodzi, ale o ilość. Jak będziesz co chwila alokował po np. 16 bajtów, to szansa duża, że będziesz miał bloki z całej wolnej pamięci i system nie bedzie mial jak przydzielić komuś innemu albo tobie dłuższego bloku.
W czasach pamieci wirtualnej to praktycznie niemożliwe, no ale wiesz, jak ktoś takie rzeczy gada, to znaczy, że wydaje mu sie, że optymalizuje...
  • Odpowiedz
@jacekprim: w skrócie chodzi o to żeby wykorzystywać poprzednio zaalkowaną pamieć i nie prosic systemu o nowe bloki.

Załóżmy, że chcesz alokować x2 więc mamy taki ciąg alokacji: n,2n,4n,8n,16n,... Zauważ że za każdym razem, alokator musi prosić system o nowe miejsce w pamięci, gdyż 4n>(2n+n), 8n>(4n+2n), 16n>(8n+4n). Alokator nie może więc skorzystać z pamięci, którą dysponuje, musi prosić system o nowe miejsce. Jeśli dasz x1.5 to masz taki ciąg alokacji:
  • Odpowiedz