2011-12-15 25 views
9

Me preguntaba cuál es el límite de tamaño para una clase. Hice una prueba sencilla:¿Cuál es el límite de tamaño para una clase?

#define CLS(name,other) \ 
class name\ 
{\ 
public: \ 
name() {};\ 
    other a;\ 
    other b;\ 
    other c;\ 
    other d;\ 
    other e;\ 
    other f;\ 
    other g;\ 
    other h;\ 
    other i;\ 
    other j;\ 
    other k;\ 
}; 

class A{ 
    int k; 
public: 
    A(){}; 
}; 

CLS(B,A); 
CLS(C,B); 
CLS(D,C); 
CLS(E,D); 
CLS(F,E); 
CLS(G,F); 
CLS(H,G); 
CLS(I,H); 
CLS(J,I); 

No es capaz de compilar con

" 'J': clase es demasiado grande"

Si quito el final de declaración - CLS(J,I);, se todo compila bien.

¿Es esta una restricción impuesta por el compilador, o está en algún lugar del estándar?

+0

Con la última definición, llega a unos 10 GB (dependiendo del relleno) para la clase J. – dalle

+0

Lo estaba declarando, no realmente usándolo.Apuesto a que declarar una matriz de algunas clases H rompería el tiempo de ejecución :) –

Respuesta

14

En C++ 11 este es el Anexo B. Implementaciones puede imponer límites, pero deberían ser de al menos:

  • tamaño de un objeto [262 144].
  • Miembros de datos en una sola clase [16 384].
  • Miembros declarados en una sola clase [4 096].

El tercero no es directamente relevante para el tipo de construcción que está utilizando, lo menciono sólo porque indica que el segundo es de hecho los total de miembros, presumiblemente, incluidos los de las bases y me No estoy seguro de los miembros de los miembros. Pero no se trata solo de los miembros enumerados en una definición de clase única.

Su implementación parece haber renunciado a 2^31 miembros de datos, o al tamaño 2^32, ya que acepta I pero no J. Es bastante obvio que un compilador se niegue a considerar clases con un tamaño mayor que SIZE_MAX, incluso si el programa no crea una instancia o usa sizeof en el tipo. Así que incluso con el mejor esfuerzo posible por parte del compilador, nunca esperaría que esto funcione en una implementación de 32 bits.

Tenga en cuenta que "estas cantidades son solo pautas y no determinan el cumplimiento", por lo que una consecuencia conforme puede imponer un límite menor arbitrario incluso cuando tiene suficientes recursos para compilar un programa que utiliza números mayores. No hay un límite mínimo para la conformidad.

Existen varias oportunidades en el estándar de C++ para que una implementación conforme sea inútil debido a los límites de recursos ridículamente pequeños, por lo que no se produce ningún daño adicional si se trata de otra.

C++ 03 es más o menos el mismo:

  • tamaño de un objeto [262 144].
  • Miembros de datos en una sola clase, estructura o unión [16 384].
  • Miembros declarados en una sola clase [4 096].
+0

Perfecto, gracias. –

+0

@Steve Jessop. Tenga en cuenta que el Anexo B no es normativo: los valores que se ofrecen son mínimos recomendados, y que, de hecho, me sorprendería mucho si un sistema de 16 bits admite una clase con un tamaño superior a 65565. –

+0

@James: sí, Lo he notado. Buen punto de 16 bits, se espera que 'SIZE_MAX' sea menor que el límite recomendado. –

0

Estoy seguro de que su compilador depende. Puede ejecutar su compilador en un modo de solo preproceso para ver cuál es la salida generada si tiene curiosidad. Es posible que también desee ver la expansión de la plantilla en lugar de las macros.

+0

Esto era solo una pregunta puramente teórica, es por eso que estoy usando macros. ¿Por qué necesitaría plantillas? Además, si es específico del compilador, debe haber alguna mención de un límite mínimo en el estándar. Ese es el tipo de respuesta que estaba buscando. –

Cuestiones relacionadas