Jak to możliwe, że zmienne lokalne przechowywane na stosie można używać w dowolnej kolejności?

0

Z tego co mi wiadomo, wykorzystując stos dostęp ma się do elementu przechowywanego na samej górze. Z drugiej strony ucząc się C++ czytam, że zmienne lokalne są przechowywane na stosie, a przecież mogę z nich korzystać w dowolnej kolejności. Mogłby ktoś wyjaśnić mi jak to właściwie jest z tymi zmiennymi?

3

W klasycznej wersji stosu faktycznie nie ma dostępu do żadnego z elementów, poza tym ostatnim - jednak w kontekście architektury x86, słowo stos jest bardziej umowne i występuje możliwość dostępu do poprzednich elementów (koniec końców "stos" jest jedynie miejscem w pamięci - dlaczego mielibyśmy być przez coś ograniczani?).

Lektura: https://en.wikibooks.org/wiki/X86_Disassembly/The_Stack

0

A nie jest tak przypadkiem, że zmienne lokalne są zamieniane na jakiś wskaźnik, który wskazuje ich względną pozycję względem stosu? Albo coś takiego. Jeśli piszesz w jakimś natywnym języku typu C++ to powinieneś móc włączyć sobie w IDE podgląd assemblera i wtedy zobaczysz jak to wygląda skompilowane do assemblera (przynajmniej jak kiedyś w C++ Builder czy Delphi pisałem to pamiętam, że było coś takiego).
https://cs.stackexchange.com/a/76873

0

W języku Forth jest taki stos o jakim mówisz. Nie ma tam funkcji wykonuje się tylko operacje na zmiennych z góry stosu. Mimo to da się za jego pomocą stworzyć skomplikowane programy np gry.

1
quark001 napisał(a):

Z tego co mi wiadomo, wykorzystując stos dostęp ma się do elementu przechowywanego na samej górze. Z drugiej strony ucząc się C++ czytam, że zmienne lokalne są przechowywane na stosie, a przecież mogę z nich korzystać w dowolnej kolejności. Mogłby ktoś wyjaśnić mi jak to właściwie jest z tymi zmiennymi?

Na stosie maszynowym (tak, to jest stos praktycznie taki jak w teorii) jest odkładana ramka (frame). Możesz ją rozumieć jako strukturę ze zmiennymi lokalnymi (i trochę buchalterii).
Pobranie zmiennej "i" to nie zdjęcie ze stosu, ale wykorzystanie zmiennej z tej struktury, nie jest ona przy tym niszczona.
Dobry kompilator C w trybie kompilacji do ASM by to pokazał.

Cała ramka jest niszczona przy powrocie z funkcji, zgodnie z teoretycznym obrazem jak pracuje stos. Tu by był doktorat o konwencji wywołania, inna dla C, inna dla paskali ...

LukeJL napisał(a):

A nie jest tak przypadkiem, że zmienne lokalne są zamieniane na jakiś wskaźnik, który wskazuje ich względną pozycję względem stosu?

Nie ma potrzeby zgadywać. na poziomie intuicyjnym masz dobry kierunek, ale realnie to jest "offset" (chyba nie ma polskiego odpowiednika) a nie "wskaźnik". Zmienne lokalne mają go ujemny, parametry dodatni (lub na odwrót, i jeszcze zalezy od konwencji wywołania) WZGLĘDEM STOSU (na chwilę wejścia do funkcji).
Poniewaz maszynowy wskaźnik stosu (np SP) ciągle pracuje, ten wejściowy jest kopiowany, na x86 do rejestru BP

0

Z tego co mi wiadomo, wykorzystując stos dostęp ma się do elementu przechowywanego na samej górze.

Zależy jak sobie ten stos zaimplementujesz. Dla przykładu Javowy Stack daje bezpośredni dostęp do wszystkich elementów: https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html Stos wątku działa podobnie.

0
Srebrny Wąż napisał(a):

W języku Forth jest taki stos o jakim mówisz. Nie ma tam funkcji wykonuje się tylko operacje na zmiennych z góry stosu. Mimo to da się za jego pomocą stworzyć skomplikowane programy np gry.

W Forth są dwa stosy, "mało interesujący" dla programisty stos z adresami powrotu, w zasadzie maszynowy, i ten "główny", gdzie jest cały "fun".

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