2011-01-09 9 views
12

Statik üye değişkenlerin tipik olarak C++ gibi dillerde nasıl uygulandığını ve bunların kullanımlarının örneklenmiş nesnelerin boyutunu nasıl etkilediğini merak ediyorum.Statik üye değişkenleri nesne boyutunu nasıl etkiler?

Statik üyelerin bu sınıfın tüm örnekleri tarafından paylaşıldığını biliyorum, ancak nasıl paylaşılır? Nesne boyutunu etkilerse, 10 statik değişken 1'den daha fazla boyutta olur mu?

  • her statik verileri gösteren bir işaretçi ekleyerek bazı uygulamalar sanal fonksiyon masaya
  • bir işaretçi eklemek benzer şekilde nesnesi: Ben uygulanabileceği iki yollar geliyor çünkü

    soruyorum

  • statik veri sadece doğrudan C++ bağlayıcı/yükleyici
+1

Kendinizi kolayca test edebileceğiniz bir soru budur. Sadece uygun sınıfları oluşturun ve sizeof (T) 'yi ne kadar büyük olduklarını söyleyin. –

+0

@Martin York: AFAIK, Java'da bir boyut kullanıcısı yoktur. –

+1

[in-java-ne-en-bir-boyut-of-bir-boyut-of-the-en-of-en-yolunu belirlemek] (http://stackoverflow.com/questions/52353/in-java-what-is -en-nesnenin boyutunu belirlemek için en iyi yol) –

cevap

23

tarafından çözümlenen ofset, statik üyeleri sınıfın örneklerine ait olmayan bir küresel değişkeni gibi başvurulmaktadır. Örneklerin büyüklüğünü ve sınıfını bile 1 bit artırmazlar!

struct A 
{ 
    int i; 
    static int j; 
}; 
struct B 
{ 
    int i; 
}; 
std::cout << (sizeof(A) == sizeof(B)) << std::endl; 

Çıktı:

olduğunu
1 

, A ve B boyutu tamamen aynıdır. Statik üyeler, A::j aracılığıyla erişilen genel nesneler gibidir. ideone de

bakınız gösteri: http://www.ideone.com/YeYxe


$ 9.4.2/1 C++ Standard (2003) dan, statik veri üyesi ait subobjects parçası değildir

Bir sınıf. sadece bir kopyasını, sınıfının tüm nesneleri tarafından paylaşılan bir statik veri üyesi 'dur. Standard'tan

$ 9.4.2/3

ve 7, statik veri üyesi tanımlanmış olduktan sonra

, bu hiçbir nesne sınıfının yaratılmıştır bile var.

Statik veri üyeleri başlatılır ve tam olarak yerel olmayan nesneleri (3.6.2, 3.6.3) gibi imha edilir.

Dediğim gibi statik üyeleri daha küresel nesneler gibidir!

+0

@Nawaz: İlginç. Yani eğer biz A serileştirmek istiyorsak, sadece gerekli olan belleğin büyüklüğün (A) sonucudur. Sağ? O zaman gerçek bedeni nasıl bilebiliriz? – Nerian

+4

statik değişkenler, nesnenin kendisinin bir parçası değildir ve olduğu gibi serileştirilmemelidir. –

+1

@Nerian: serileştirme ayrıca, serileştirilmiş nesneye hangi üyelerin dahil edilmek istediğine ve nelerin yapılmadığına bağlıdır. Statik üyeler, sınıfların * örneklerine ait olmadığından, büyük olasılıkla bunu seri hale getirmek istemezsiniz; A :: j' kullanılarak erişilen genel nesneler gibidir. Neyse, bana güvenme. Serileştirme hakkında fazla bir şey bilmiyorum. Bilen birini sor. Ve başka bir konu başlat. :-) – Nawaz

6

Statik üyeler derleyici tarafından derleme zamanında çözülür. Birçok açıdan statik değişkenler, başlık altındaki global değişkenlerden farklı değildir. Farklılıklar, yalnızca kodunuzda onlara nasıl başvurduğunuza, göründükleri alana, nasıl ve ne zaman başlatıldıklarına bağlıdır.

+0

Cevabınızı daha fazla açıklayan referans malzeme için bir bağlantı ekler misiniz, lütfen? – Davidann

+2

@David: Elbette, Vinay değilim, ama ne tür referans materyallerin buna hitap edeceğinden emin değilim. Bence Vinay'ın cevabı en iyisi C++ ve Java için dil özelliklerinde neyin desteklenmediği ile en iyi şekilde destekleniyor: Tanımlardaki hiçbir şey statik değişkenlerin * ders örneklerinde bir çalışma zamanı yükü uygulayacağını; bu nedenle, yapmazlar. –