C++ non consente un oggetto di dimensione zero, poiché ogni oggetto deve avere un indirizzo di memoria univoco. Quindi, se avete:
struct empty {};
// ...
empty myempty;
empty* ptr = &myempty;
poi ptr
deve puntare ad un indirizzo di memoria univoco. Lo standard afferma che la dimensione minima per un oggetto è 1 byte per questo scopo. Allo stesso modo, le allocazioni di dimensione 0 sono consentite e restituiscono un puntatore valido, anche se la scrittura su quel puntatore non è consentita (questo funziona per malloc(0)
e new empty
restituisce un puntatore a un byte, dal sizeof(empty) == 1
).
Se io traggo da empty
in questo modo:
struct derived : public empty
{
int data;
}
non v'è più alcun punto nella classe base empty
che occupa un byte, perché tutti derived
avranno un indirizzo univoco a causa del membro data
. La citazione "Base subobjects di classe può avere dimensione zero" è presente per consentire, in questo caso, per il compilatore di non utilizzare alcuno spazio per empty
, ad esempio sizeof(derived) == 4
. Come afferma il titolo, è solo un'ottimizzazione, ed è perfettamente legale per la parte empty
di derived
occupare spazio zero.
Perché pensi che una regione di archiviazione non può essere di dimensioni zero? Apparentemente può :) –
Call malloc (0). – bmargulies
@bmargulies 'malloc' è espressamente scritto in C in modo che non sia necessario creare un oggetto di dimensione zero:" Se la dimensione dello spazio richiesto è zero, il comportamento è definito dall'implementazione: viene restituito un puntatore nullo , o il comportamento è come se la dimensione fosse un valore diverso da zero " –