resueltos - ¿Por qué el tamaño de una clase vacía en C++ no es cero?
miembros de una clase en programacion orientada a objetos (5)
Posible duplicado:
C ++: ¿Cuál es el tamaño de un objeto de una clase vacía?
¿Por qué la siguiente salida 1
?
#include <iostream>
class Test
{
};
int main()
{
std::cout << sizeof(Test);
return 0;
}
Para garantizar que las direcciones de dos objetos diferentes serán diferentes. Por la misma razón, "nuevo" siempre devuelve punteros a objetos distintos.
Ver Stroustrup para una respuesta completa.
El estándar de C ++ garantiza que el tamaño de cualquier clase es al menos uno. El estándar de C ++ establece que ningún objeto tendrá la misma dirección de memoria que otro objeto. Hay varias buenas razones para esto.
Para garantizar que siempre
new
devolverá un puntero a una dirección de memoria distinta.Para evitar algunas divisiones por cero. Por ejemplo, los aritméticos de puntero (muchos de los cuales los hace automáticamente el compilador) implican dividir por
sizeof(T)
.
Sin embargo, tenga en cuenta que no significa que una clase base vacía agregará 1 al tamaño de una clase derivada:
struct Empty { };
struct Optimized : public Empty {
char c;
};
// sizeof(Optimized) == 1 with g++ 4.0.1
El estándar no permite objetos (y clases de ellos) de tamaño 0, ya que eso haría posible que dos objetos distintos tengan la misma dirección de memoria. Es por eso que incluso las clases vacías deben tener un tamaño de (al menos) 1.
La clase sin ningún miembro de datos y la función miembro de ese tipo de clase se conoce como clase vacía. El tamaño del objeto de la clase vacía es siempre de 1 byte.
Cuando creamos el objeto de cualquier clase en ese momento, el objeto siempre obtiene 3 características, es decir,
- Estado
- Comportamiento
- Identidad
Cuando creamos el objeto de la clase vacía en ese momento, el estado de ese objeto no es nada. El comportamiento de ese objeto tampoco es nada, pero el compilador asigna una dirección única a ese objeto. La memoria en la computadora siempre se organiza en forma de bytes y la memoria mínima disponible en la ubicación de la dirección del objeto es de 1 byte. Es por eso que el tamaño del objeto de la clase vacía es de 1 byte.
Lo que dijeron Maurits y Péter.
Es interesante observar en este contexto que los compiladores pueden hacer una optimización de clase base vacía (EBCO):
#include <iostream>
struct Foo {};
struct Bar : Foo {};
int main () {
std::cout << sizeof(Foo) << '','' << sizeof(Bar) << std::endl;
}
Esto probablemente imprimirá "1,1" si lo compila y lo ejecuta. Ver también Vandevoorde / Josuttis 16.2 en EBCO.