2010-11-23 18 views
5

tengo el siguiente códigoAnidado clase vacía

class nest_empty 
{ 
    class empty{}; 
}; 

¿El tamaño de nest_empty ser 1 (en mi aplicación sizof una clase vacía es 1)? ¿Si es así por qué? ¿Se puede considerar nest_empty como una clase vacía?

EDIT:

class nest_empty 
{ 
    class empty{}; 
    empty d; 
}; 

¿El tamaño de nest_empty siendo 1? ¿Si es así por qué?

+0

No estoy 100% seguro, pero estoy bastante seguro de que las clases anidadas son "estáticas", al igual que las clases regulares. Por lo tanto, su clase nest_empty seguiría siendo de tamaño 1 a menos que le diera una instancia de empty(); Tengo curiosidad por ver cuál es la respuesta. – Crisfole

+0

@equilibrium: cambiar la pregunta después de tener respuestas sin identificar correctamente lo que se ha cambiado es muy confuso ... He agregado un separador ** EDIT **. –

Respuesta

6

Su primera versión de nest_empty es una clase vacía (no hay miembros de datos no estáticos, y no hay bases no vacíos), por lo que si tienen el tamaño 1 en su aplicación, que tiene el tamaño 1.

"¿Por qué "es porque las clases vacías tienen el tamaño 1 en su implementación, que a su vez es porque no pueden tener tamaño 0 (el estándar lo prohíbe) y su implementador ha elegido 1.

Su segunda nest_empty no es una clase vacía (tiene un miembro de datos no estáticos). Es legalmente podría tener el tamaño 1, ya que su único miembro de datos no estático, d, es de tipo empty, que es una clase vacía y, por tanto, presumiblemente, de tamaño 1.

No puedo decir si realmente tendrá tamaño 1 en su implementación, sin embargo. Pregunta a tu compilador.

3

Sí. empty está solo en el espacio de nombre de nest_empty.

Para ser más claros, la línea class nest_empty{}; simplemente define nest_empty. No declara ningún miembro en empty.

+0

ver las ediciones .. –

+0

El tamaño no será 0 en función de lo que la implementación considere correcta. período. – Chubsdad

+0

en ese caso, el segundo 'nest_empty' no es una clase vacía (tiene un miembro, incluso si el miembro tiene un tipo que es una clase vacía). Y sí, el tamaño de 'nest_empty' seguirá siendo el tamaño de su contenido más el relleno, que es el tamaño de' vacío' más el relleno, que será, como lo señalan los otros carteles, un valor positivo. – lijie

3

No es obligatorio que sizeof(nest_empty) sea 1, pero no será cero.

$ 9.3 dice: Complete objects and member subobjects of class type shall have nonzero size.

Esto es necesario ya que si se crea una matriz de nest_empty, cada uno tiene que tener una dirección diferente de la otra.

EDITAR

Lo más probable es sizeof(nest_empty) se obtendrán los mismos resultados tanto en versión, pero que no es obligatoria. Lo único que dice el estándar es que la clase vacía tendrá un tamaño distinto de cero.

+0

ver las ediciones .. –

+0

@equilibrium: la implementación está permitida (por el estándar) para tener 'sizeof (nest_empty) == sizeof (empty)'. En la mayoría de los compiladores, obtendrás ambos iguales a '1'. –

Cuestiones relacionadas