Neden c ++ sınıfının boyutu veri üyelerinin genel / özel durumuna bağlıdır?


23

Bildiğim kadarıyla, c ++ 'da bir sınıfın boyutu aşağıdaki faktörlere bağlıdır -

  1. Statik olmayan tüm veri üyelerinin boyutu.
  2. Veri üyelerinin sırası.
  3. Bayt dolgusu etkin veya etkin değilse.
  4. Temel taban sınıfının büyüklüğü.
  5. Sanal fonksiyonların varlığı.
  6. Kalıtım modu (sanal kalıtım).

Şimdi aşağıdaki gibi 2 sınıf oluşturdum -

class A{
    int a;
    short s;
    int b;
    char d;
};// kept a char at last on purpose to leave a "hole"

class B : public A{
    char c;  
};

şimdi A ve BI boyutlarını kontrol etmeye bakın

  • A boyutu: 16
  • B boyutu: 16

benim varsayımım, B sınıfındaki char c, A sınıfında kalan "delik" içine yerleştirilir.

Ancak, kafamı karıştıran, üyeleri herkese açık hale getirdiğim aşağıdaki senaryo

class A{
    public:
    int a;
    short d;
    int b;
    char s;
};

class B : public A{
    public:
    char c;
};

Şimdi boyut

  • A boyutu: 16
  • B boyutu: 20

Bu farkın nedenini anlayamıyorum.


1
Neden c ++ sınıfının boyutu veri üyelerinin genel / özel durumuna bağlıdır? - Olmaz. Bunlar derleyiciye bağlı uygulama ayrıntılarıdır.
PaulMcKenzie

1
Peki hangi derleyiciyi kullanıyorsunuz?
Romen

2
@PaulMcKenzie Aslında öyle. Standart, aynı erişime sahip üyelerin birlikte gruplandırılmasını zorunlu kılar ve böylece derleyicinin dolgu stratejisini değiştirir.
NathanOliver

@ NathanOliver-ReinstateMonica, bunu bilmiyordum. Herhangi bir şansla ilgili bölüme bir referansınız var mı?
R Sahu

@RSahu Cevabımı sıkıca koymak için bakıyorum.
NathanOliver

Yanıtlar:


8

Itanium ABI , "mizanpaj amaçlı POD" sınıflarını tanımlamak için POD'un C ++ 03 tanımını kullanır . Özel veri üyelerine sahip olmak, bir sınıfın toplu ve dolayısıyla P ++ 03'te POD olmasını engeller:

Bir POD-yapı tipi olmayan POD yapı, POD olmayan birlik (ya da bu tip bir dizi) ya da referans bir statik olmayan verilerin üyeye sahip bir agrega sınıftır ve kullanıcı tarafından tanımlanan kopyalama atama operatörü sahiptir ve hiçbir kullanıcı tanımlı yıkıcı.

POD sınıfı olmak kuyruk dolgu kullanımını yeniden devre dışı bırakır :

Bu türlerin boyut, boyut ve nvalign değerleri normal büyüklükleri ve hizalamaları olarak tanımlanır. Bu özellikler yalnızca temel sınıflar olarak kullanılan boş olmayan sınıf türleri için önemlidir. POD'lar için kuyruk dolgusunu görmezden geliriz, çünkü standardın erken bir sürümü onu başka bir şey için kullanmamıza izin vermedi ve bazen türün daha hızlı kopyalanmasına izin verdi.

Bu nedenle, ilk örneğinizde, Ayerleşim amaçları için bir POD değildir ve kuyruk dolgusu için kullanılabilir B::c, ancak ikinci örneğinizde bir POD'dur ve kuyruk dolgusu yeniden kullanılamaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.