Biorąc pod uwagę ten kod:Dlaczego wielokrotne dziedziczenie zwiększa rozmiar obiektu, mimo że bazy są puste?
#include <iostream>
struct A {
};
struct B {
};
struct C {
};
struct E : A {
int field;
};
struct F : A, B {
int field;
};
struct G : A, B, C {
int field;
};
int main() {
std::cout << _MSC_VER << std::endl;
std::cout << sizeof(E) << std::endl;
std::cout << sizeof(F) << std::endl;
std::cout << sizeof(G) << std::endl;
int o;
std::cin >> o;
return 0;
}
Jestem podane następujące dane wyjściowe:
1900
4
8
8
Dlaczego F
i G
mieć rozmiary 8
chociaż ich podstawy są puste? Dlaczego nie zwiększy się również rozmiar E
?
Buduję to z Visual Studio Community 2015, wersja 14.0.25431.01 Aktualizacja 3. Wersja MSVC++ to najwyraźniej 9.0.
Jak to możliwe? Jakie są racjonalne uzasadnienia dla tak osobliwego układu pamięci?
Dlaczego powinien to być błąd? Jaką regułę języka uważasz za niezgodną z kompilatorem? –
@Kerrek Jeśli to nie jest błąd, ponieważ nie narusza standardu, to równie dobrze odpowiada na moje pytanie. –
@KerrekSB Może nieformalna zasada "nie płacisz za to, czego nie używasz". Choć nie jest to zgodne ze standardem, martwiłoby mnie, gdybym myślał, że zostanie naruszony. – Brian