2010-03-14 11 views
8

Czy to zły styl zaprojektować proste programy C, aby przydzielić wszystko lub prawie wszystko na stosie?Alokacja stosów w C

+3

To zależy od tego, co znaczy "wszystko". – AraK

+1

Jeśli zamierzasz zrobić wszystko z lokalnymi i parametrami, dlaczego używasz C na pierwszym miejscu? Zamiast tego użyj języka funkcjonalnego, takiego jak ML, Haskell, Erlang itp. –

+0

W przeciwieństwie do tego, o czym myślisz? Zmienne globalne lub dane na stercie? –

Odpowiedz

16

Używanie sterty jest złym sposobem, jeśli naprawdę tego nie potrzebujesz. Zwłaszcza w prostych programach.

+2

Powiedziałbym więcej niż +1, gdybym mógł. Alokacja stosów jest bezpieczna, zapobiega wyciekom pamięci i pozwala uniknąć problemów z pustymi lub niedozwolonymi wskaźnikami. Użyj go, gdy tylko jest to możliwe. – kyoryu

+1

+1 - Absolutnie - stert jest bardziej złożoną strukturą danych niż stos, a nie tylko niepotrzebnym obciążeniem w wielu przypadkach, ale także przyczyną niepotrzebnej złożoności z potencjalnymi problemami, takimi jak zwisające wskaźniki, wycieki pamięci, uszkodzenie sterty itp. Nie ma powodu, aby w razie potrzeby unikać stosu, ale z pewnością jest to opcja "w razie potrzeby", a nie rozsądna opcja domyślna. – Steve314

+0

I nie ma sterty w C. –

1

Jeśli kładziemy nacisk na PROSTYCH programach, tak jak powiedziałeś, to nie, to nie jest takie złe :) Możesz także rzucić okiem na tablice o zmiennej długości C99 (tutaj jest prosty przykład: http://en.wikipedia.org/wiki/Variable-length_array).

+0

+1 Za wzmiankę o VLA. Użyłem ich w małym projekcie i przez większość czasu pomagali unikać przydziału sterty. – helpermethod

0

Nie. Jeśli nie masz zmiennych o nie ustalonym rozmiarze. Taki kod może dość szybko przepełnić stos.

3

Alokacje stosu są tańsze niż alokacje sterty. Alokacja i dealokacja ze stosu to po prostu prosty przyrost licznika i dekrementacja na wejściu/wyjściu funkcji (lub dokładniej: scope). Przydział sterty oznacza znalezienie wystarczająco dużego bloku pamięci w potencjalnie pofragmentowanej przestrzeni adresowej. Z tego powodu alokacje stosu są prawie zawsze preferowane.

Główne powody nieużywania stos są:

  • Wielkość potrzebna nie jest znana aż do czasu wykonywania.
  • Potrzebna jest duża ilość pamięci (megabajtów); co może powodować problemy w systemach, w których rozmiary stosów są zwykle ograniczone do dwucyfrowych liczb megabajtów.
+2

Lub jeśli potrzebna jest duża ilość pamięci (kilobajtów); co może powodować problemy w systemach, w których rozmiary stosów są zwykle ograniczone do dwucyfrowej liczby kilobajtów (takich jak sterowniki urządzeń na komputerach PC lub dowolny program w większości systemów wbudowanych). – Dipstick

1

Główną zaletą sterty jest to, że można ją dynamicznie przydzielić. Jeśli nie znasz rozmiaru potrzebnej zmiennej: sterty.

Jeśli twój program jest prosty, może nie być konieczne przydzielanie zmiennej na stercie; ale wybór nie zależy od złożoności programu, zależy to od potrzeby posiadania zmiennej. Jeśli chcesz uzyskać dostęp/modyfikować zmienną w całym przepływie pracy, za pomocą kilku funkcji, to lepiej na sterty. Uwolnisz go, kiedy już go nie będziesz potrzebować. Jeśli zmienna jest po prostu strukturą opcji lub licznikiem, stos jest do tego idealny.

Powiązane problemy