SORU
19 Ocak 2014, Pazar


Neden boyutu == üye ekliyorum rağmen(DerivedClass) boyutu.

sizeof(Base) == 24 sizeof(Derived) == 24 aşağıda kodu.

Neden onların boyutları eşittir?

Base Sınıf 3 üye var ve Derived sınıfta başka bir üye var.

class Base
{
private:
    double d;
protected:
    long l;
public:
    int i;
};

class Derived : public Base
{
private:
    float f;
};

CEVAP
19 Ocak 2014, Pazar


Bu sınıf Base 8 bayt hizalama gereksinimi olan çok oldu, ama son üyesi 4 boyutu vardır. Bu boş dolgu Alanı Basesonu's bellek düzeni. ekledi götürür Ekstra dolgu sözde kendilerini sınıf Base nesneleri örneğini rolünü oynaren türetilmiş nesneleri.

Base b; // <- a most-derived object
Base a[10]; // <- an array of most-derived objects

"Temel sınıf içine Derived, Base gömülü sınıfın sonunda ekstra Dolgu için gerek yok. sınıf olarak" Base embed ancak,

Derived d; // <- object `d` contains an embedded sub-object of type `Base`

Akıllı bir derleyici sınıf ekstra alan Derived yerleştirerek bu alanı yeniden yerleşim alanı Base Dolgu için kullanılan içine çalışacaktır. Senin durumunda ekstra alan Derived::f Bu arada 4 bayt aynı boyut vardır, yani orada mükemmel bir şekilde uyar. Sonuç sınıfı toplam boyutu artmaz.

Çok benzer (doğada) etkisi denir yani "boş baz optimizasyonu". C herhangi bir türü için sizeof boş bir sınıfı sizeof Her zaman sıfırdan büyük olduğu anlamına gelir, 0, daha büyük olması sağlanır. Boş bir sınıf başka bir sınıf türetmek, ancak temel sınıf tam olarak türetilmiş bir sınıf boyutu 0 bayt katkıda gözlemek. Örneğin

struct A {};
struct B {};
struct C {};
struct D {};

struct F : A, B, C, D {
  int i;
}

int main() {
  std::cout << sizeof(A) << std::endl << sizeof(B) << std::endl << 
               sizeof(C) << std::endl << sizeof(D) << std::endl;
  std::cout << sizeof(F) << std::endl;
}

Her temel sınıf sizeof sıfırdan büyük olmasına rağmen sizeof(F) genelde hala eğer temel sınıf subobjects hiç var olmasa da sizeof(int), değerlendirir.

Diğer bir deyişle, bu gibi örneklerin gösterdiği gibi, temel sınıf subobjects en türetilmiş nesneleri daha bellek düzeni açısından kayda değer ölçüde daha rahat kuralları izleyin. Bu rahat kuralları kolayca temel sınıf sizeof sadece kısmen türetilmiş sınıf sizeof katkıda bulunacaktır durumlar neden olabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • ChrisCrossMedia

    ChrisCrossMe

    17 EYLÜL 2009
  • circuschina

    circuschina

    16 Mart 2007