Czy to zły styl zaprojektować proste programy C, aby przydzielić wszystko lub prawie wszystko na stosie?Alokacja stosów w C
Odpowiedz
Używanie sterty jest złym sposobem, jeśli naprawdę tego nie potrzebujesz. Zwłaszcza w prostych programach.
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 - 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
I nie ma sterty w C. –
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).
+1 Za wzmiankę o VLA. Użyłem ich w małym projekcie i przez większość czasu pomagali unikać przydziału sterty. – helpermethod
Nie. Jeśli nie masz zmiennych o nie ustalonym rozmiarze. Taki kod może dość szybko przepełnić stos.
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.
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
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.
- 1. Valgrind mówi "alokacja stosów", mówię "alokacja sterty"
- 2. Alokacja pamięci w C++
- 3. Alokacja pamięci w C
- 4. Alokacja ciągu w języku C++
- 5. Alokacja pamięci w STL C++
- 6. Alokacja pamięci dla macierzy w C
- 7. CUDA: Alokacja pamięci urządzenia pakującego w C++
- 8. Jak działa alokacja w Objective C?
- 9. Tworzenie obiektów w pamięci stosów w java?
- 10. Programowalne macierze stosów Theano?
- 11. Statyczna i dynamiczna alokacja pamięci obiektów w C++
- 12. Alokacja pamięci dla tablicy char
- 13. Alokacja pamięci zespołu
- 14. Dynamiczna alokacja pamięci szeregowej
- 15. Alokacja pamięci zoptymalizowana przez kompilatory
- 16. Alokacja pamięci wewnątrz jądra CUDA
- 17. Pula obiektów a alokacja dynamiczna
- 18. Alokacja pamięci char * i char []
- 19. Pomijanie instrukcji przy użyciu rozbijania stosów
- 20. Warunek przerwania dla klatek wyższych stosów
- 21. x86_64 wywoływanie konwencji i ramek stosów
- 22. Generowanie dokumentacji dla stanów stosów soli
- 23. Czy rozwijanie stosów naprawdę wymaga blokad?
- 24. Alternatywy dla jawnych stosów w ćwiczeniach usuwania RTOS?
- 25. Alokacja stosu nie powiedzie się i alokacja sterty zakończy się sukcesem! Czy to możliwe?
- 26. zamawiania stosów według wielkości w ggplot2 ułożone słupkowy
- 27. Uzyskiwanie poprawnych stosów wywołań w profilerze współrzędnych VS
- 28. Gdzie umieszcza się wiele stosów i stert w pamięci wirtualnej?
- 29. Zapisywanie i przywracanie stosów UINavigation w celu ponownego połączenia
- 30. Uprawnienia do analizy ewakuacji/alokacji stosów za pomocą Java 7
To zależy od tego, co znaczy "wszystko". – AraK
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. –
W przeciwieństwie do tego, o czym myślisz? Zmienne globalne lub dane na stercie? –