2011-01-09 16 views
12

Zastanawiam się, w jaki sposób statyczne zmienne składowe są zwykle implementowane w językach takich jak C++ i czy ich użycie wpływa na rozmiar instancji obiektów.W jaki sposób statyczne zmienne składowe wpływają na rozmiar obiektu?

Wiem, że statyczne elementy są współużytkowane przez wszystkie wystąpienia tej klasy, ale w jaki sposób są udostępniane? Jeśli ma wpływ na rozmiar obiektu, czy 10 zmiennych statycznych zwiększy rozmiar o 1?

Pytam bo mogę pomyśleć dwa sposoby to może być realizowane:

  • dodając wskaźnik do danych statycznych dla każdego obiektu w podobny sposób niektóre implementacje dodać wskaźnik do tablicy funkcji wirtualnych
  • danych statycznych jest właśnie odniesione bezpośrednio jak zmiennej globalnej z offsetu jest rozwiązany przez linker/loader
+1

Jest to rodzaj pytania, które można łatwo sprawdzić samodzielnie. Po prostu utwórz odpowiednie klasy i wykonaj sizeof (T), aby dowiedzieć się, jak duże są. –

+0

@Martin York: AFAIK, nie ma operatora sizeof w Javie. –

+1

[w-java-jaki-jest-najlepszy-sposób-określić-rozmiar-obiektu-obiektu] (http://stackoverflow.com/questions/52353/in-java-what-is -najlepszy-sposób-określić-rozmiaru-obiektu) –

Odpowiedz

23

w C++, członkowie statyczne nie należą do instancji klasy. nie zwiększają rozmiaru instancji i 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 członek dane nie jest częścią z podobiektów o Klasa. Jest tam tylko jedna kopia statycznego elementu danych udostępnionego przez wszystkie obiekty klasy .

$ 9.4.2/3 i 7 od standardu

raz statyczny element danych został zdefiniowane, nawet jeśli istnieje żadne przedmioty swojej klasie zostały stworzone.

Statyczne elementy danych zostały zainicjowane i zniszczone dokładnie tak, jak nielokalne obiekty (3.6.2, 3.6.3).

Tak jak powiedziałem, statyczne elementy są bardziej podobne do obiektów globalnych!

+0

@Nawaz: Interesujące. Więc jeśli chcemy serializować A, nie możemy po prostu założyć, że wymagana pamięć jest wynikiem sizeof (A). Dobrze? Jak więc możemy poznać rzeczywisty rozmiar? – Nerian

+4

Zmienne statyczne nie są częścią samego obiektu i nie powinny być przekształcane do postaci szeregowej, jak to jest. –

+1

@Nerian: serializacja zależy również od członków, których chcesz dołączyć do serializowanego obiektu, a co nie. ponieważ statyczne elementy nie należą do * instancji * klas, najprawdopodobniej nie chcesz ich przekształcać do postaci szeregowej; są bardziej jak obiekty globalne dostępne za pomocą 'A :: j'. W każdym razie nie ufaj mi opinii. Nie wiem zbyt wiele o serializacji. Zapytaj kogoś, kto wie. I zacznij inny temat. :-) – Nawaz

6

Statyczne elementy są rozwiązywane przez kompilator podczas kompilacji. Pod wieloma względami zmienne statyczne nie różnią się od zmiennych globalnych pod maską. Różnice dotyczą jedynie sposobu, w jaki się do nich odnosisz w kodzie, zakresu, w którym są widoczne, oraz tego, jak i kiedy zostaną zainicjowane.

+0

Czy chcesz dodać link do materiału referencyjnego, który objaśnia odpowiedź, proszę? – Davidann

+2

@ David: Nie jestem oczywiście Vinay, ale nie jestem pewien, jaki rodzaj materiału odniesienia by to rozwiązał. Myślę, że odpowiedź Vinaya najlepiej jest wspierać, co jest * nie * w specyfikacjach językowych odpowiednio dla C++ i Java: Nic w definicjach nie sugeruje, że zmienne statyczne * narzucałyby obciążenie środowiska wykonawczego instancjami klasy; w związku z tym nie. –

Powiązane problemy