2011-01-30 10 views

Respuesta

28

miembros estáticos no pertenecen a las instancias de la clase. ¡no aumentan las instancias y el tamaño de clase ni siquiera 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ático no es parte de los subobjetos de una clase. Hay 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.

miembros de datos estáticos se inicializan y destruyeron exactamente igual que los objetos no locales (3.6.2, 3.6.3).

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

+1

+1 para vincular a las definiciones del estándar, básicamente describe la respuesta en concreto. – dcousens

+1

Gracias muy informativo –

7

El estándar C++ no indica explícitamente cuándo se asigna la memoria estática, siempre que esté disponible en el primer uso. Dicho esto, lo más probable es que se asigne durante la inicialización del programa, garantizando así su presencia tan pronto como sea necesario, sin necesidad de un código de caso especial para detectar y realizar la asignación en el acceso.

El propósito de poner datos estáticos en una clase es lo mismo que poner cualquier otro dato en clases. Al poner los datos en una estructura de clase, está definiendo un espacio de nombres encapsulado, así como también puede controlar el acceso utilizando métodos de acceso y mutador; esto, a su vez, le permitirá validar los datos que ingresan al almacén de memoria estática y garantizar la coherencia a lo largo del uso de estos datos.

+0

En realidad, creo que el estándar trata a los miembros estáticos como todos los globales, y sus instancias se someten, hasta donde yo entiendo, a la misma ley que las instancias de otros globales. Es decir, se requiere que el orden de inicialización sea coherente dentro de una unidad de traducción y no se dice nada sobre la multiplexación con otras unidades de traducción. –

-1

Las variables estáticas se almacenan en un área especial de memoria llamada BSS, mientras que las instancias de una clase se almacenan en un montón o en una pila. Por lo tanto, los miembros estáticos se almacenan por separado.

+7

En realidad, la existencia de BSS depende del sistema. El estándar de C++ no define ninguna de esas bestias, ni ningún detalle de la implementación de la asignación de datos. –

Cuestiones relacionadas