Gdzie są przechowywane zmienne lokalne, globalne, statyczne, auto, register, extern, const, lotne?
Gdzie przechowywane są zmienne lokalne, globalne, statyczne, auto, register, extern, const, volatile?
5 answers
-
Zmienne lokalne mogą być przechowywane na stosie lub w segmencie danych w zależności od tego, czy są automatyczne czy statyczne. (jeśli nie podano ani auto, ani static, przyjmuje się, że auto)
Zmienne globalne są przechowywane w segmencie danych (chyba że kompilator może je zoptymalizować, patrz const) i mają widoczność od punktu deklaracji do końca jednostki kompilacji.
Statyczne zmienne są przechowywane w segment danych (ponownie, chyba że kompilator może je zoptymalizować) i mieć widoczność od punktu deklaracji do końca zakresu. Zmienne globalne, które nie są statyczne, są również widoczne w innych jednostkach kompilacji (patrz extern).
Zmienne Auto są zawsze lokalne i są przechowywane na stosie.
Modyfikator register mówi kompilatorowi, aby zrobił wszystko, co w jego mocy, aby utrzymać zmienną w rejestrze, jeśli jest to w ogóle możliwe. W przeciwnym razie jest przechowywane na stosie.
Extern zmienne są przechowywane w segmencie danych. Modyfikator extern mówi kompilatorowi, że inna jednostka kompilacji deklaruje zmienną, więc nie twórz jej kolejnej instancji, bo w czasie połączenia dojdzie do kolizji nazw.
Zmienne Const mogą być przechowywane na stosie lub w segmencie danych readonly w zależności od tego, czy są automatyczne czy statyczne. Jeśli jednak kompilator może stwierdzić, że nie można odwoływać się z innej jednostki kompilacji, lub że Twój kod nie używa adresu zmiennej const, można go dowolnie optymalizować (każde odniesienie może być zastąpione stałą wartością). W takim razie nie jest nigdzie przechowywany.
Modyfikator volatile mówi kompilatorowi, że wartość zmiennej może ulec zmianie w dowolnym momencie pod wpływem czynników zewnętrznych (zazwyczaj sprzętowych), więc nie powinien próbować optymalizować usuwania przeładowań z pamięci do rejestru, gdy ta zmienna jest odwołana. Oznacza to statyczne przechowywanie.
BTW wszystko to dotyczy C & C++ jak i Objective-C.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-10 14:23:20
Na jakim poziomie abstrakcji szukasz odpowiedzi?
Na poziomie fizycznym, wszystkie są prawdopodobnie przechowywane w pojemnościach wrót i domenach magnetycznych. (Może nawet fotony, jeśli dysk wymiany jest podłączony do Wi-Fi lub światłowodu.)
Na jednym poziomie sprzętowym kopie wszystkich tych zmiennych mogą istnieć w kilku miejscach w rejestrze, pamięci podręcznej danych (być może na wielu poziomach), pamięci głównej i / lub hierarchii pamięci masowej, wszystko od całkowicie zamienionego na dysk lub NV storage (w zależności od istnienia, implementacji i aktualnego stanu dowolnego podsystemu pamięci wirtualnej na żądanie), być może wszystko w rejestrach, jeśli rozmiar i żywotność aplikacji jest wystarczająco mała.
Biorąc pod uwagę najbardziej znane implementacje kompilatora i środowiska uruchomieniowego, pamięć (być może wirtualna) jest podzielona na stosy i stosy. Biorąc pod uwagę formalną definicję języka, może to być wymagane lub nie.
Na poziomie optymalizacji kompilatora, wiele z tych zmienna mogła zostać zoptymalizowana. Nie są przechowywane nigdzie poza abstrakcją.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 17:08:09
Zmienne lokalne i auto
są przechowywane na stosie. Zmienne globalne i static
są przechowywane w zakładce DANE. register
zmienne są przechowywane w rejestrze na CPU, jeśli to możliwe, w przeciwnym razie w stosie. extern
, const
, i volatile
nie określają, gdzie zmienna jest przechowywana; zmienna jest przechowywana tam, gdzie mówią inni specyfikatorzy pamięci.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-10 14:10:44
Zmienne lokalne są zwykle przechowywane na stosie, a zmienne globalne w segmencie "tekstowym" programu (w przypadku stałych łańcuchowych) lub na stercie, jeśli są przydzielane dynamicznie. Zmienne Auto są zwykle używane w funkcjach/metodach i są zazwyczaj przekazywane na stosie (czasami również w rejestrach, w zależności od architektury). Zmienne rejestru były kiedyś przechowywane w rejestrach, ale większość kompilatorów obecnie ignoruje słowo kluczowe register i umieszcza je tam, gdzie uznają to za stosowne -- na stos lub w rejestrze. Członkowie Extern, const i volatile są modyfikatorami, więc nie mają ostatecznego miejsca, w którym są przechowywane.
Więc krótka odpowiedź brzmi, jak zwykle, "to zależy".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-10 18:04:30
LOCAL-zmienne lokalne, których zakres jest w function.It mogą być dwa typy auto lub statyczne. Jeśli jest zadeklarowana po prostu int var.Kompilator traktuje jako klasę auto storage. Zmienne auto są przechowywane w stosie. Zmienne statyczne są przechowywane w segmencie danych.
Zmienne rejestru są przechowywane w CPU.Jeśli nie są dostępne rejestry do przechowywania zmiennych.następnie kompilator traktuje jako zmienną automatyczną.
Zmienne globalne są przechowywane w obszarze segmentu danych.
Zmienne const są przechowywane w obszarze tylko do odczytu.To jest obszar segmentu kodu memeory.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-03 08:27:03