2008-09-18 7 views

Odpowiedz

28

Specyfikator klasy pamięci kontroluje przechowywanie izmienne. Są to dwie koncepcje, które są różne. C określa następujące specyfikatory zmiennych: auto, extern, register, static.

bagażu
Czas przechowywania określa, jak długo żyć będzie zmienna w pamięci RAM.
Istnieją trzy typy czasu przechowywania: statyczny, automatyczny i dynamiczny.

statyczny
Jeśli zmienna jest zadeklarowana w zakresie plików lub ze specyfikacją extern lub statycznej, to będzie musiał pamięci statycznej. Zmienna będzie istnieć tak długo, jak długo program będzie wykonywany. Nie trzeba tracić czasu na tworzenie tych zmiennych.

automatyczny
Jeśli zmienna jest zadeklarowana w funkcji, ale bez extern lub static specyfikującego, ma automatycznego zapisu. Zmienna będzie istnieć tylko podczas wykonywania funkcji. Po powrocie zmienna już nie istnieje. Automatyczne przechowywanie jest zwykle wykonywane na stosie. Tworzenie tych zmiennych jest bardzo szybką operacją (wystarczy zwiększyć wskaźnik stosu o wielkość).

dynamiczny
Jeśli używasz malloc (lub nowa w C++) używasz dynamicznego magazynowania. Ta pamięć będzie istnieć, dopóki nie zadzwonisz za darmo (lub nie usuniesz). Jest to najdroższy sposób tworzenia pamięci, ponieważ system musi dynamicznie zarządzać alokacją i dealokacją.

Łącze
Łącznik określa, kto może zobaczyć i odwołać się do zmiennej. Istnieją trzy rodzaje powiązań: wewnętrzne powiązania, zewnętrzne powiązania i brak powiązań.

bez połączenia
Ta zmienna jest widoczna tylko tam, gdzie została zadeklarowana. Zwykle dotyczy zmiennych zadeklarowanych w funkcji.

wewnętrzny podnośnik
Zmienna ta będzie widoczna dla wszystkich funkcji w pliku (jest to tzw translation unit), ale inne pliki nie będą wiedzieć, że istnieje.

link zewnętrzny
Zmienna będzie widoczna dla innych jednostek tłumaczeniowych. Są one często uważane za "zmienne globalne".

Oto tabela opisująca przechowywania i łączenie cech opartych na specyfikatorami

 
    Storage Class Function   File 
    Specifier  Scope    Scope 
----------------------------------------------------- 
    none   automatic   static  
       no linkage  external linkage 

extern   static   static 
       external linkage external linkage 

static   static   static 
       no linkage  internal linkage 

    auto   automatic   invalid 
       no linkage 

register   automatic   invalid 
       no linkage 
+1

Powinny zawierać nieco więcej szczegółów na temat jednostek tłumaczeniowych, ponieważ są to nie tylko pliki ... są to pliki źródłowe oraz wszelkie nagłówki w nich zawarte (jednak pośrednio). – workmad3

+1

Wow ... +1. Zauważ, że "auto" zmieni swoje znaczenie z C++ 0x: http://en.wikipedia.org/wiki/C%2B%2B0x – paercebal

+0

Aktualizacja dla C++ 11: czas przechowywania wątku. Obiekt jest przydzielany, gdy wątek zaczyna się i zwalnia, gdy wątek się kończy. Każdy wątek ma swoją własną instancję obiektu. Tylko obiekty o nazwie thread_local mają ten czas przechowywania. thread_local może pojawić się razem ze statycznym lub zewnętrznym w celu dostosowania powiązania. – czxyl

0

Zmienne klasy pamięci lub typ Specyfikatory (jak lotne, auto i statyczne) określają jak/gdzie są zapisywane podczas wykonywania programu zmienne. Na przykład zmienne zdefiniowane w funkcjach są zwykle zapisywane na stosie, co oznacza, że ​​zostaną utracone po powrocie funkcji. Za pomocą słowa kluczowego "static" można zmusić kompilator do umieszczenia zmiennej w segmencie danych w pamięci, dzięki czemu zawartość zmiennych będzie trwała między wywołaniami do tej funkcji. Słowo kluczowe "register" sprawi, że kompilator będzie próbował jak najmocniej, aby umieścić zmienną w rejestrze procesora, przydatne dla liczników w pętlach itp. Nie ma jednak gwarancji, że faktycznie jest w rejestrze.

Przeczytaj więcej o specyfikatorach typów here.

+0

Dla dziwnej definicji "próbuj tak mocno, jak to możliwe", co zwykle oznacza "nie rób w ogóle nic". 'register' jest całkowicie przestarzały, z wyjątkiem dokumentu (przez wymuszenie), że twój kod nie może przyjąć adresu zmiennej. –