Powiedz, że mam klasę i mam w niej statyczny element, ale nie tworzę żadnych obiektów tego typu. Czy pamięć będzie zajęta dla zmiennej statycznej? Jeśli byłby zajęty, jaki jest sens umieszczenia go w klasie?Czy statyczne elementy klasy zajmują pamięć, jeśli nie utworzono żadnego obiektu tej klasy?
Odpowiedz
nr
statyczne członkowie nie należą do instancji klasy. nie zwiększają instancji i rozmiaru klasy nawet o 1 bit!
struct A
{
int i;
static int j;
};
struct B
{
int i;
};
std::cout << (sizeof(A) == sizeof(B)) << std::endl;
wyjściowa:
1
Oznacza to, że wielkość A
i B
jest dokładnie taka sama. statyczne elementy są bardziej podobne do globalnych obiektów dostępnych przez A::j
.
See demonstracja w ideone: http://www.ideone.com/YeYxe
$ 9.4.2/1 z C++ Standard (2003),
statyczny element danych nie jest częścią z podobiektów o charakterze klasa. Istnieje tylko jedna kopia statycznego elementu danych udostępniona przez wszystkie obiekty klasy .
$ 9.4.2/3 i 7 od standardu
raz statycznego członka dane zostały zdefiniowane, nawet jeśli istnieje żadne przedmioty swojej klasie zostały stworzone.
statycznych pól są inicjowane i zniszczone dokładnie jak nielokalnych obiektów (3.6.2, 3.6.3).
Tak jak powiedziałem, statyczne elementy są bardziej podobne do obiektów globalnych!
Standard C++ nie określa wprost, kiedy przydzielona jest pamięć statyczna, o ile jest dostępna przy pierwszym użyciu. To powiedziawszy, jest ono najprawdopodobniej przydzielane podczas inicjowania programu, co gwarantuje jego obecność, gdy tylko jest to wymagane, bez konieczności stosowania specjalnego kodu do wykrywania i wykonywania przydziału w dostępie.
Celem umieszczania danych statycznych w klasie jest to samo, co umieszczanie jakichkolwiek innych danych w klasach. Poprzez umieszczenie danych w strukturze klas definiujesz enkapsulującą przestrzeń nazw, a także możesz kontrolować dostęp za pomocą metod dostępu i mutatora; to z kolei pozwoli ci zweryfikować dane przechodzące do magazynu pamięci statycznej i zapewnić spójność podczas korzystania z tych danych.
Właściwie uważam, że standard traktuje statycznych członków jak wszystkie globale, a ich instancje są przekazywane, o ile rozumiem, do tego samego prawa, co instancje innych globali. Oznacza to, że porządek inicjalizacji musi być spójny w obrębie jednostki tłumaczeniowej i nie ma nic powiedziane na temat multipleksowania z innymi jednostkami tłumaczeniowymi. –
Zmienne statyczne są przechowywane w specjalnym obszarze pamięci o nazwie BSS, natomiast wystąpienia klasy są przechowywane w stercie lub na stosie. Zatem statyczne elementy są przechowywane osobno.
W rzeczywistości istnienie BSS zależy od systemu. Standard C++ nie definiuje żadnej takiej bestii, ani żadnych szczegółów dotyczących implementacji alokacji danych. –
- 1. Czy członkowie klasy zajmują pamięć?
- 2. Twórz statyczne instancje klasy wewnątrz tej klasy w Pythonie
- 3. Fragmenty jako klasy statyczne
- 4. Czy plasterki tabeli zajmują pamięć w R?
- 5. C#: (Statyczne) Zmienne poziomu klasy
- 6. Metody statyczne klasy Python
- 7. Deklarowanie instancji klasy wewnątrz tej klasy
- 8. Klasy Java i bloki statyczne
- 9. Czy lokalna klasa w metodzie klasy jest przyjacielem tej klasy?
- 10. Czy inicjalizacja elementu statycznego klasy jest gwarantowana przed inicjalizacją statycznego obiektu tej klasy?
- 11. dlaczego nie możemy zadeklarować obiektu klasy w tej samej klasie?
- 12. Uzyskaj statyczne zmienne klasy potomnej z klasy nadrzędnej?
- 13. Czy MEF może eksportować/importować klasy statyczne?
- 14. jQuery: Wybierz elementy klasy X, które nie mają rodzeństwa z tej klasy
- 15. Statyczne klasy w Delphi (Win32)
- 16. Czy można utworzyć instancję klasy bez uruchamiania ŻADNEGO kodu z klasy? (brak inicjalizacji, brak inicjalizacji pól)
- 17. klasy statyczne i wiele wystąpień na lazurach
- 18. Klasy naukowe i statyczne - jak?
- 19. Zamknięcie obiektu ByteArrayOutputStream nie ma żadnego efektu?
- 20. Czy istnieje sposób na uzyskanie nazwy klasy klasy pochodnej QObject bez tworzenia instancji tej klasy?
- 21. nieusunięte elementy klasy css
- 22. Czy przypięte są statyczne elementy zajęć?
- 23. statyczne vs klasy jako zmienną klasy/metody (SWIFT)
- 24. JavaScript - Jak wywołujesz funkcję wewnątrz klasy z poziomu tej klasy?
- 25. Uzyskaj nazwę klasy z obiektu klasy
- 26. Pole klasy (pole statyczne) w Delphi
- 27. Czy metody klasy zwiększają wielkość instancji klasy?
- 28. Przekazywanie obiektu klasy do jądra
- 29. Statyczne klasy/metody/nieruchomość w badanej jednostki, zatrzymać lub nie
- 30. Metody obiektu tej samej klasy mają ten sam identyfikator?
+1 za połączenie z definicjami ze standardu, zasadniczo przedstawia odpowiedź w sposób konkretny. – dcousens
Dzięki bardzo pouczające –