120 ROZDZIAŁ 17. WSKAŹNIKI Wskaźniki na stałą wartość są przydatne między innymi w sytuacji gdy mamy duży obiekt (na przykład strukturÄ z kilkoma polami). JeÅli przypiszemy takÄ
zmiennÄ
do innej zmiennej, kopiowanie może potrwaÄ dużo czasu, a oprócz tego zostanie zajÄte dużo pamiÄci. Przekazanie takiej struktury do funkcji albo zwrócenie jej jako wartoÅÄ funkcji wiÄ
że siÄ z takim samym narzutem. W takim wypadku dobrze jest użyÄ wskaźnika na staÅÄ
wartoÅÄ. void funkcja(const duza_struktura *ds) { /* czytamy z ds i wykonujemy obliczenia */ } funkcja(&dane); /* mamy pewnoÅÄ, że zmienna dane nie zostanie zmieniona */ Dynamiczna alokacja pamiÄci MajÄ
c stycznoÅÄ z tablicami można siÄ zastanowiÄ, czy nie daÅoby siÄ mieÄ tablic, których rozmiar dostosowuje siÄ do naszych potrzeb a nie jest na staÅe zaszyty w kodzie programu. ChcÄ
c pomieÅciÄ wiÄcej danych możemy po prostu zwiÄkszyÄ rozmiar tablicy â ale gdy do przechowania bÄdzie mniej elementów okaże siÄ, że marnujemy pamiÄÄ. JÄzyk C umożliwia dziÄki wskaźnikom i dynamicznej alokacji pamiÄci tworzenie tablic takiej wielkoÅci, jakiej akurat potrzebujemy. O co chodzi Czym jest dynamiczna alokacja pamiÄci? Normalnie zmienne programu przechowywane sÄ
na tzw. stosie (ang. stack ) â powstajÄ
, gdy program wchodzi do bloku, w którym zmienne sÄ
zadeklarowane a zwalniane w momencie, kiedy program opuszcza ten blok. JeÅli deklaru- jemy tak tablice, to ich rozmiar musi byÄ znany w momencie kompilacji â żeby kompilator wygenerowaÅ kod rezerwujÄ
cy odpowiedniÄ
iloÅÄ pamiÄci. DostÄpny jest jednak drugi rodzaj rezerwacji (czyli alokacji) pamiÄci. Jest to alokacja na stercie (ang. heap ). Sterta to obszar pamiÄci wspólny dla caÅego programu, przechowywane sÄ
w nim zmienne, których czas ży- cia nie jest zwiÄ
zany z poszczególnymi blokami. Musimy sami rezerwowaÄ dla nich miejsce i to miejsce zwalniaÄ, ale dziÄki temu możemy to zrobiÄ w dowolnym momencie dziaÅania programu. Należy pamiÄtaÄ, że rezerwowanie i zwalnianie pamiÄci na stercie zajmuje wiÄcej czasu niż analogiczne dziaÅania na stosie. Dodatkowo, zmienna zajmuje na stercie wiÄcej miejsca niż na stosie â sterta utrzymuje specjalnÄ
strukturÄ, w której trzymane sÄ
wolne partie (może to byÄ np. lista ). Tak wiÄc używajmy dynamicznej alokacji tam, gdzie jest potrzebna â dla danych,
(…)
…. W takim wypadku dobrze jest użyć wskaźnika na stałą wartość.
void funkcja(const duza_struktura *ds)
{
/* czytamy z ds i wykonujemy obliczenia */
}
funkcja(&dane); /* mamy pewność, że zmienna dane nie zostanie zmieniona */
Dynamiczna alokacja pamięci
Mając styczność z tablicami można się zastanowić, czy nie dałoby się mieć tablic, których
rozmiar dostosowuje się do naszych potrzeb a nie jest na stałe…
... zobacz całą notatkę
Komentarze użytkowników (0)