Kiedy ktoś mówi o specyfikacji klasy pamięci, o czym on mówi?
Często też mówią o powiązaniach zmiennych w tym samym kontekście, co to jest?Co to jest specyfikator powiązań i specyfikacji zmiennej?
Odpowiedz
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
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.
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. –
- 1. Co to jest specyfikator formatu dla `long double`
- 2. Specyfikator formatu Float to String Specyfikator
- 3. printf zmiennej String Długość Specyfikator
- 4. Co to jest "__maybe_unused"?
- 5. Co to jest metoda statyczna i zmienne?
- 6. Co to jest Thread.CurrentPrincipal i co robi?
- 7. Co to jest S_ISREG() i co robi?
- 8. Co to jest []
- 9. Co to jest POI i co to znaczy?
- 10. Co to jest RPM_BUILD_ROOT?
- 11. Co to jest relacja między Xtext i ANTLR?
- 12. Co to jest mapowanie PDO?
- 13. Co to jest WebIDL i (dlaczego) jest to ważne?
- 14. Co to jest Serializable? Co to znaczy?
- 15. Co to jest zmienna flag?
- 16. Co to jest "usuń to"?
- 17. Co to jest obiekt w C?
- 18. Co to jest idiom programowania?
- 19. Co to jest "zmienna wolna"?
- 20. co to jest Ljava.lang.String; @
- 21. Co to jest NSEraCalendarUnit?
- 22. Co to jest jQuery18007779947370290756
- 23. Co to jest VertiPaq i jak działa
- 24. co to jest serwer HiveServer i oszczędzania
- 25. Co to jest "!", "?", "_" I "." składnia w eliksiru
- 26. Co to jest CGSUpdateManager i dlaczego narzeka?
- 27. Co to jest | i używa się operatorów?
- 28. Co to jest inf i nan?
- 29. Co to jest substytut :: shadow i/deep /?
- 30. Co to jest innodb_buffer_pool_size i innodb_log_file_size?
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
Wow ... +1. Zauważ, że "auto" zmieni swoje znaczenie z C++ 0x: http://en.wikipedia.org/wiki/C%2B%2B0x – paercebal
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