¿Los miembros estáticos de una clase ocupan memoria si no se crea ningún objeto de esa clase?

Digamos que tengo una clase y tengo un miembro estático en ella, pero no creo ningún objeto de ese tipo. ¿Se ocupará la memoria de la variable estática? Si estaría ocupado, ¿cuál es el sentido de ponerlo en una clase?

No.

los miembros estáticos no pertenecen a las instancias de 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 el mismo. los miembros estáticos son más como objetos globales a los que se accede a través de A::j .

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


$ 9.4.2 / 1 del Estándar C ++ (2003),

Un miembro de datos estáticos no es parte de los subobjetos de una clase. Solo hay una copia de un miembro de datos estáticos compartida por todos los objetos de la clase.

$ 9.4.2 / 3 y 7 del Estándar,

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

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!

El estándar de C ++ no establece 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 progtwig, 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 las 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.

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