Zmienne dynamiczne a alokacja pamieci....

0

Witam! Moje pytanie brzmi tak: jaki istnieje zwiazek miedzy typem deklarowanej zmiennej dynamicznej a iloscia alokowanej pamieci. i czy liczbę elementow tablicy dynamicznej mozna zmienic w trakcie dzialania programu.

0

Ilość pamięci zaalokowanej przez new zależy od tego jakiego typu ma być to zmienna(alokuje tyle ile musi - nie mniej, nie więcej).
Tak, można zmienić rozmiar, ale jest to kosztowne(może wymagać przekopiowania całej zawartości w nowe miejsce) - http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

0

mozesz uzasadnic dlaczego?, przeczytalem zawartosc twojego linku, ale jestem poczatkujacy nie za bardzo rozumiem o co tam chodzi...

0

tzn dlaczego mozna zmienic rozmiar?

0

Program rezerwuje sobie miejsce w pamięci na tą tablicę. Następnie zaraz za nią dodaje sobie inne dane, np. inne zmienne. Jak chcesz powiększyć tablicę to nie może jej rozdzielić i zostawić pół w 1 miejscu pół w drugim, musi przepisać całą zawartość w nowe miejsce, a to zabiera sporo czasu, szczególnie jak jest dużo elementów.

.#Up/Down
Hmmm... chyba można sobie wywnioskować z tego co napisałem przed chwilą. Po prostu jest funkcja która na to pozwala. Jakby nie było mógłbyś stworzyć nową tabelę, większą o ile potrzebujesz i 'ręcznie' przepisywać wartości. Zresztą ta funkcja pewnie tak właśnie działa.

0

no tak ale jak uzasadnic to ze mozna zmienic rozmiar?

0

Ogólnie to zwiększenie tablicy dynamicznej polega na tym, że alokujesz nowe miejsce o większym rozmiarze niż poprzednio i kopiujesz do niego zawartość tablicy. Możesz spróbować algorytmu naiwnego, czyli przy dodaniu pojedynczego elementu tworzysz nową tablicę o wielkości o jeden większą. Jest to jednak wtedy bardzo wolne, bo kopiujesz n*(n-1)/2 razy pojedyncze elementy. W rzeczywistości rezerwuje się jakąś pamięć na elementy, i przy wykorzystaniu przez dodawane elementy tej rezerwy, jest ona zwiększana ileś razy, np. często dwukrotnie (nie pamiętam jak jest w rzeczywistych implementacjach np. std::vector). Przy zwiększaniu dwukrotnym po dodaniu n elementów do takiego pustego kontenera może się zrobić w sumie maksymalnie 3n kopii pojedynczych elementów, będziesz miał zaalokowane maksymalnie 2n pamięci i w danej chwili maksymalnie będziesz potrzebował 3n pamięci (obliczenie tego pozostawię jako zadanie dla czytelnika).

0

ok juz rozumiem, a jeszcze mam jedno pyanko (nie chce zakladac nowego tematu) dlaczego w tym programie jes tuzyte dwukrotne przypisanie do wskaznika wsk tablicy...przeciez niby i tak bedzie wskazywalo dopiero pozniej na pierwszy element:

 int main()
{
  char tab[40];
  char *wsk;
  int znaki = 0;
  wsk = tab;
  cout << "Podaj tekst:" << endl;
  cin.getline(tab,40);
  wsk = tab;
  while (*wsk!='\0')
  {
    znaki++;
    wsk++;
  }
  cout << "Wprowadziles " << znaki << " znakow";
  getchar();
  return 0;
}
0

Wystarczy jeden. Dowolny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1