2011-01-30 16 views

Odpowiedz

28

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!

+1

+1 za połączenie z definicjami ze standardu, zasadniczo przedstawia odpowiedź w sposób konkretny. – dcousens

+1

Dzięki bardzo pouczające –

7

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.

+0

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. –

-1

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.

+7

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. –

Powiązane problemy