Klasa pamięci w C ++ definiuje czas życia i widoczność zmiennej / funkcji. Czas życia to czas, do którego zmienna pozostaje aktywna, a widoczność to dostępność zmiennej z różnych modułów programu. To pomaga prześledzić istnienie określonej zmiennej w czasie wykonywania programu. W tym blogu poświęconym klasom pamięci przyjrzymy się różnym klasom pamięci używanym w C ++.
Zaczynajmy.
Co to jest klasa pamięci w C ++?
Każda zmienna w C ++ ma typ danych i klasę pamięci. Typ danych określa typ danych, które mogą być przechowywane w zmiennej, takiej jak int, float, char itp. Klasa pamięci kontroluje dwie różne właściwości zmiennej: okres istnienia i zakres.
Widziałbyś, że każda zmienna ma typ danych, ale do tej pory nie widziałeś żadnej klasy pamięci dołączonej do zmiennej. W rzeczywistości, jeśli nie zdefiniujesz klasy pamięci, kompilator automatycznie przypisze do niej domyślną klasę pamięci. Klasa przechowywania zmiennej zawiera informacje o miejscu przechowywania zmiennej w pamięci, domyślnej wartości początkowej, zakresie zmiennej i jej czasie życia.
Typy klas pamięci
W programie C ++ istnieje pięć klas pamięci:
- automatyczny
- zarejestrować
- statyczny
- zewnętrzny
- zmienny
Omówmy szczegółowo każdą z klas pamięci.
Auto Storage Class
Automatyczna (automatyczna) klasa pamięci jest domyślną klasą pamięci dla wszystkich zmiennych lokalnych, które są zadeklarowane wewnątrz funkcji lub bloku. Słowo kluczowe auto jest rzadko używane podczas pisania pliku Program w C ++ .
Zakres zmiennych automatycznych mieści się w funkcji lub bloku, w którym zostały zadeklarowane i nie można uzyskać do niego dostępu poza tą funkcją lub blokiem. Dostęp do niej można również uzyskać w zagnieżdżonych blokach w macierzystym bloku / funkcji, w której zadeklarowano zmienną automatyczną.
Możesz uzyskać dostęp do zmiennych automatycznych poza ich zakresem za pomocą zmiennej wskaźnikowej. Musisz wskazać tę samą lokalizację w pamięci, w której znajdują się zmienne.
Jego żywotność jest taka sama, jak czas życia funkcji. Po zakończeniu wykonywania funkcji zmienna jest niszczona.
Domyślnie podczas deklaracji przypisywana jest do nich wartość śmieciowa.
Składnia:
typ danych var_name1 [= wartość]
lub
automatyczny typ danych var_name1 [= wartość]
W powyższym przykładzie dwie zmienne są zdefiniowane z tą samą klasą pamięci. Auto można używać tylko do definiowania zmiennych lokalnych, tj. Wewnątrz funkcji.
Zarejestruj klasę pamięci
Jak sama nazwa wskazuje, klasa pamięci rejestru służy do deklarowania zmiennych rejestrowych. Cała funkcjonalizacja zmiennej rejestru jest taka sama jak zmiennej automatycznej, z wyjątkiem tego, że kompilator próbuje przechowywać te zmienne w rejestrze mikroprocesora, jeśli dostępny jest wolny rejestr. Jeśli wolny rejestr nie jest dostępny, są one następnie przechowywane tylko w pamięci.
W związku z tym operacje na zmiennych rejestrowych są znacznie szybsze niż na innych zmiennych, które są przechowywane w pamięci podczas działania programu.
Ogólnie, kilka zmiennych, które muszą być często używane w programie, jest zadeklarowanych w klasie pamięci rejestrów, aby poprawić czas działania programu. Adresu zmiennej rejestru nie można uzyskać za pomocą wskaźników.
Maksymalny rozmiar zmiennej jest równy rozmiarowi rejestru (tj. W przybliżeniu jedno słowo). Nie może mieć zastosowanego jednoargumentowego operatora „&”, ponieważ nie ma miejsca w pamięci.
Składnia:
rejestr typu danych var_name1 [= wartość]
Przykład:
jak zrobić zagnieżdżone tabele w html
{register int pi}
Zdefiniowanie „rejestru” nie oznacza, że zmienna będzie przechowywana w rejestrze. Może być przechowywany w rejestrze w zależności od ograniczeń sprzętowych i implementacyjnych.
Spójrzmy na przykład klas rejestrów i automatycznego przechowywania.
Przykład:
#include using namespace std // deklarowanie zmiennej, która ma zostać zmieniona na extern // wartość początkowa może być również zainicjowana do x int x void autoStorageClass () {printf ('nDemonstrating auto classnn') // zadeklarowanie zmiennej automatycznej (po prostu // zapisanie 'int a = 32' też działa) int num = 32 // drukowanie zmiennej automatycznej 'a' printf ('Wartość zmiennej' num '' 'zadeklarowanej jako auto:% dn', num) printf ( '--------------------------------')} void registerStorageClass () {printf ('nDemonstrating register classnn') / / deklarowanie zmiennej rejestru register char c = 'G' // wypisywanie zmiennej rejestru 'b' printf ('Wartość zmiennej' c '' 'zadeklarowanej jako rejestr:% dn', c) printf ('---- ---------------------------- ')} int main () {// Aby zademonstrować automatyczną klasę pamięci autoStorageClass () // Aby zademonstrować register Klasa pamięci registerStorageClass () return 0}
Wynik:
Statyczna klasa pamięci
Do deklarowania używana jest statyczna klasa pamięci zmienne statyczne . Zmienne statyczne zachowują swoją wartość (tj. Ostatnią wartość), nawet jeśli są poza ich zakresem. Zmienne statyczne są inicjalizowane tylko raz &istnieją do zakończenia programu.
Pamięć jest przydzielana tylko raz do zmiennej statycznej i nie jest przydzielana żadna nowa pamięć, ponieważ nie są one ponownie deklarowane. Dostęp do globalnych zmiennych statycznych można uzyskać w dowolnym miejscu programu. Domyślnie kompilator przypisuje im wartość 0.
W C ++, gdy statyczny jest używany na składowej danych klasy, powoduje to, że tylko jedna kopia tego elementu członkowskiego jest współużytkowana przez wszystkie obiekty tej klasy.
Składnia:
statyczny typ danych var_name1 [= wartość]
Przykład:
#include void function (void) static int c = 5 // Globalna zmienna statyczna main () {while (c--) {function ()} return 0} void function (void) {static int cnt = 2 cnt ++ std :: cout<< 'cnt is ' << cnt std::cout << ' and c is ' << c << std::endl }
Wynik:
Klasa pamięci zewnętrznej
Zewnętrzna klasa pamięci jest wymagana, gdy zmienne muszą być współużytkowane w wielu plikach. Zmienne zewnętrzne mają zasięg globalny i są widoczne poza plikiem, w którym zostały zadeklarowane. Zmienna extern jest widoczna dla wszystkich programów. Jest używany, jeśli co najmniej dwa pliki współużytkują tę samą zmienną lub funkcję.
Czas życia zmiennych extern jest tak długi, jak program, w którym są zadeklarowane, jest zakończony. Normalną zmienną globalną można również uczynić zewnętrzną, umieszczając słowo kluczowe „extern” przed jej deklaracją / definicją w dowolnej funkcji / bloku.
Kiedy używasz „extern”, zmienna nie może zostać zainicjowana, ponieważ wszystko, co robi, to wskazanie nazwy zmiennej w miejscu przechowywania, które zostało wcześniej zdefiniowane.
Składnia
typ danych zewnętrznych nazwa_zmiennej1
Przykład
#include int cnt extern void write_extern () main () {cnt = 5 write_extern ()}
Drugi plik: support.cpp
#include extern int cnt void write_extern (void) {std :: cout<< 'Count is ' << cnt << std::endl }
Tutaj słowo kluczowe extern jest używane do zadeklarowania cnt w innym pliku. Teraz skompiluj te dwa pliki w następujący sposób & minus
$ g ++ main.cpp support.cpp -o write
Spowoduje to utworzenie wykonywalnego programu do zapisu, spróbuj wykonać zapis i sprawdź wynik w następujący sposób & minus
$. / write
5
Przechodząc do przodu z klasą pamięci w C ++, spójrzmy na ostatnią, tj. Klasę pamięci Mutable.
Zmienna klasa pamięci
Specyfikator mutowalny ma zastosowanie tylko do obiektów klas, co pozwala elementowi obiektu przesłonić stałą funkcję składową. Oznacza to, że zmienny element członkowski może być modyfikowany przez stałą funkcję składową.
java różnica między hashmap i hashtable
Na koniec spójrzmy na tabelę porównawczą, aby zrozumieć różnice między różnymi klasami pamięci.
Klasa pamięci | Słowo kluczowe | Dożywotni | Widoczność | Wartość początkowa |
Automatyczny | automatyczny | Blok funkcyjny | Lokalny | Śmieci |
Zewnętrzny | zewnętrzny | Cały program | Światowy | Zero |
Statyczny | statyczny | Cały program zainstaluj php w systemie Windows 10 | Lokalny | Zero |
Zarejestrować | zarejestrować | Blok funkcyjny | Lokalny | Śmieci |
Zmienny | zmienny | Klasa | Lokalny | Śmieci |
Teraz, po przejrzeniu powyższych programów w C ++, zrozumiałbyś, czym są różne klasy pamięci w C ++ i jak je zaimplementować. Mam nadzieję, że ten blog zawiera wiele informacji i jest dla Ciebie wartością dodaną.
W ten sposób doszliśmy do końca artykułu „Klasy pamięci w C ++”.
Jeśli chcesz dowiedzieć się więcej, zapoznaj się z autorstwa Edureka, zaufanej firmy zajmującej się edukacją online. Szkolenie i certyfikacja J2EE i SOA firmy Edureka ma na celu przeszkolenie zarówno podstawowych, jak i zaawansowanych koncepcji języka Java, a także różnych struktur Java, takich jak Hibernate i Spring.
Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy na tym blogu, a skontaktujemy się z Tobą tak szybko, jak to możliwe.