Gdzie są przechowywane zmienne lokalne, globalne, statyczne, auto, register, extern, const, lotne?

Gdzie przechowywane są zmienne lokalne, globalne, statyczne, auto, register, extern, const, volatile?

Author: temporary_user_name, 2010-09-10

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.

 65
Author: Ferruccio,
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ą.

 11
Author: hotpaw2,
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.

 5
Author: Ignacio Vazquez-Abrams,
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".

 2
Author: mipadi,
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.

 1
Author: kumar123,
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