C++ no permite un objeto de tamaño cero, porque cada objeto debe tener una dirección de memoria única. Así que si usted tiene:
struct empty {};
// ...
empty myempty;
empty* ptr = &myempty;
continuación ptr
debe apuntar a una dirección de memoria única. El estándar establece que el tamaño mínimo para un objeto es de 1 byte para este propósito. De forma similar, las asignaciones de tamaño 0 están permitidas y devuelven un puntero válido, incluso si no se permite escribir en ese puntero (esto funciona para malloc(0)
, y new empty
devuelve un puntero a un byte, desde sizeof(empty) == 1
).
Si derivo de empty
así:
struct derived : public empty
{
int data;
}
ya no hay ningún punto en la clase base empty
que ocupa un byte, porque todo derived
tendrá una dirección única, debido al miembro data
. La cita "Subobjetos de clase base puede tener tamaño cero" está presente para permitir, en este caso, que el compilador no use ningún espacio para empty
, tal que sizeof(derived) == 4
. Como dice el título, es solo una optimización, y es perfectamente legal que empty
parte de derived
ocupe cero espacio.
¿Por qué crees que una región de almacenamiento no puede ser de tamaño cero? Aparentemente puede :) –
Llamar malloc (0). – bmargulies
@bmargulies 'malloc' está redactado específicamente en C para que no necesite crear un objeto de tamaño cero:" Si el tamaño del espacio solicitado es cero, el comportamiento está definido por la implementación: se devuelve un puntero nulo , o el comportamiento es como si el tamaño fuera un valor distinto de cero " –