2011-01-09 7 views
12

Me pregunto cómo las variables estáticas de los miembros se implementan típicamente en lenguajes como C++ y si su uso afecta el tamaño de los objetos instanciados.¿Cómo afectan las variables de miembro estático al tamaño del objeto?

Sé que un miembro estático es compartido por todas las instancias de esa clase, pero ¿cómo se comparte? Si afecta el tamaño del objeto, ¿tendría 10 variables estáticas agregando más tamaño que 1?

Lo digo porque puedo pensar en dos formas en que se puede implementar:

  • añadiendo un puntero a datos estáticos a cada objeto similar a la forma en que algunas implementaciones añaden un puntero a la tabla de función virtual
  • los datos estáticos se acaba de hacer referencia directamente como una variable global con el desplazamiento de ser resuelto por el enlazador/cargador
+1

Este es el tipo de pregunta que podría hacerse fácilmente. Solo crea las clases apropiadas y haz sizeof (T) te dirá qué tan grandes son. –

+0

@Martin York: AFAIK, no hay operador sizeof en Java. –

+1

[in-java-cuál-es-la-mejor-manera-de-determinar-el-tamaño-de-un-objeto] (http://stackoverflow.com/questions/52353/in-java-what-is -la mejor manera de determinar el tamaño de un objeto) –

Respuesta

23

En C++, los miembros estáticos no pertenecen a las instancias de la clase. ¡no aumentan el tamaño de instancias y clase incluso en 1 bit!

struct A 
{ 
    int i; 
    static int j; 
}; 
struct B 
{ 
    int i; 
}; 
std::cout << (sizeof(A) == sizeof(B)) << std::endl; 

Salida:

1 

Es decir, el tamaño de A y B es exactamente igual. los miembros estáticos son más como objetos globales a los que se accede a través del A::j.

Ver demostración en Ideone: http://www.ideone.com/YeYxe


$ 9.4.2/1 de la Norma C++ (2003),

Un miembro de datos estáticos no es parte de los subobjetos de una clase. Hay es solo una copia de un miembro de datos estáticos compartido por todos los objetos de la clase .

$ 9.4.2/3 y 7 de la Norma,

una vez que el miembro de datos estática ha sido definido, existe incluso si de su clase no se han creado objetos.

Los miembros de datos estáticos se inicializan y se destruyen exactamente como los objetos no locales (3.6.2, 3.6.3).

Como dije, ¡los miembros estáticos son más como objetos globales!

+0

@Nawaz: Interesante. Entonces, si queremos serializar A, no podemos simplemente asumir que la memoria necesaria es el resultado de sizeof (A). ¿Derecha? ¿Cómo podemos saber el tamaño real entonces? – Nerian

+4

las variables estáticas no son parte del objeto en sí y no deberían serializarse como están. –

+1

@Nerian: la serialización también depende de qué miembros desee incluir en el objeto serializado y qué no. dado que los miembros estáticos no pertenecen a las * instancias * de las clases, lo más probable es que tampoco desee serializarlos; son más como objetos globales a los que se accede usando 'A :: j'. De todos modos, no confíes en mi opinión. No sé mucho sobre la serialización. Pregúntele a alguien que sepa. Y comienza otro tema. :-) – Nawaz

6

El compilador resuelve los miembros estáticos en tiempo de compilación. En muchos sentidos, las variables estáticas no son diferentes de las variables globales bajo el capó. Las diferencias solo radican en cómo se refiere a ellas en su código, el alcance en el que están visibles y cómo y cuándo se inicializan.

+0

¿Agregarías un enlace para el material de referencia que explica más detalladamente tu respuesta, por favor? – Davidann

+2

@David: No soy Vinay, por supuesto, pero no estoy seguro de qué tipo de material de referencia abordaría esto. Creo que la respuesta de Vinay es mejor respaldada por lo que * no * en las especificaciones de lenguaje para C++ y Java, respectivamente: nada en las definiciones sugiere que las variables estáticas * impongan * una sobrecarga de tiempo de ejecución en instancias de clase; por lo tanto, no lo hacen. –

Cuestiones relacionadas