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?¿Los miembros estáticos de una clase ocupan memoria si no se crea ningún objeto de esa clase?
Respuesta
Nº
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!
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.
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. –
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.
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. –
- 1. ¿Los miembros de la clase ocupan memoria?
- 2. Bloqueo de miembros estáticos de una clase
- 3. Miembros de clase estáticos python
- 4. Miembros estáticos de una clase de instancia
- 5. ¿Cómo acceder a los miembros estáticos de una clase?
- 6. ¿Los miembros estáticos ayudan a la eficiencia de la memoria?
- 7. Inicializando miembros estáticos de una clase con plantilla
- 8. Declarar una instancia de una clase dentro de esa clase
- 9. Clase de plantilla C++ con miembros estáticos - Lo mismo para todos los tipos de la clase
- 10. ¿Cómo serializar los miembros de datos estáticos de una clase de Java?
- 11. Clase de miembros estáticos vs. interfaz normal tipo c
- 12. Mapa de Java, clave = clase, valor = instancia de esa clase
- 13. ¿Qué sucede en la memoria cuando se crea una instancia de una clase de C++?
- 14. ¿Por qué una clase interna no estática no puede tener miembros estáticos (campos y métodos)?
- 15. ¿Cómo y cuándo están dispuestos los miembros estáticos C#?
- 16. ¿Cómo ocultar miembros privados de una clase?
- 17. ¿El "amigo" de una clase se extiende a las clases declaradas dentro de esa clase?
- 18. ¿Cómo llamo a los miembros estáticos de una clase de plantilla?
- 19. En Java, ¿los miembros de la clase estáticos están compartidos entre los programas?
- 20. Inicializando miembros de clase no punteros
- 21. Javascript: ¿cómo se llama a una función dentro de una clase dentro de esa clase?
- 22. ¿Tener muchos métodos en una clase aumenta la sobrecarga del objeto de esa clase?
- 23. Burlarse de una clase que crea el objeto ThreadSafeClientConnManager
- 24. Llamar a una función del archivo de clase sin crear el objeto de esa clase
- 25. Definición de los miembros estáticos en C++
- 26. clase Singleton v/s con los miembros estáticos y métodos en Java
- 27. ¿Los miembros estáticos de una clase genérica están vinculados a la instancia específica?
- 28. ¿Cómo se inicializan los miembros de la clase C++ si no lo hago explícitamente?
- 29. ¿Los miembros estáticos de una clase genérica son diferentes para diferentes tipos en Java?
- 30. ¿Los métodos en las instancias de clase ocupan un lugar en la memoria?
+1 para vincular a las definiciones del estándar, básicamente describe la respuesta en concreto. – dcousens
Gracias muy informativo –