¿Dónde está la variable temporal para la inicialización del mapa creada en el siguiente programa?
Frecuentes
Visto 196 veces
0
En el siguiente fragmento de código. El mapa de variables miembro estático se inicializa utilizando su constructor predeterminado.
#include <iostream>
#include <map>
using namespace std;
class A
{
static map<int, int> m_map; //static member variable
public:
void PrintSize()
{
//accessing it
//so that the map gets into the executable
cout < m_map.size() << endl;
}
};
// Initializing the static map member variable
map<int, int> A::m_map = map<int, int>();
int main()
{
A a;
cout << sizeof(a) << endl;
a.PrintSize();
return 0;
}
El programa funciona bien. Mi pregunta es ¿dónde se forma la variable temporal para inicializar el mapa estático almacenado?
4 Respuestas
3
Aunque, "James" ha respondido acertadamente, solo quiero mostrarles cómo sucederá eso en el caso de g ++
aquí hay un código análogo con el propósito de responder:
[Fooo@EXP]$ cat TestStatic.cpp
#include<iostream>
#include<map>
using namespace std;
class DummyStatic
{
#ifdef TEST
static map<int,int> mymap;
#else
map<int,int> mymap;
#endif
};
#ifdef TEST
map<int,int> DummyStatic::mymap = map<int,int>();
#else
//Do Nothing
#endif
int main(){
DummyStatic obj;
}
ahora cuando compilamos con 'TEST' undefine y vemos el tamaño del 'exe' esto es lo que obtenemos
[Fooo@EXP]$ g++ -o TestStatic TestStatic.cpp
[Fooo@EXP]$ size TestStatic
text data bss dec hex filename
2724 300 12 3036 bdc TestStatic
Ahora lo hacemos con 'TEST' Definir...
[Fooo@EXP]$ g++ -o TestStatic TestStatic.cpp -D TEST
[Fooo@EXP]$ size TestStatic
text data bss dec hex filename
2616 300 36 2952 b88 TestStatic
Observe la diferencia en BSS
Espero que esto responda a su pregunta.
Respondido 29 ago 12, 07:08
3
Donde quiera que el compilador quiera ponerlo, siempre que se destruya al final de la expresión completa. Por lo general, estará en la pila de una función de inicialización generada por el compilador, que se llama antes
main
. (En realidad, en este caso particular, el compilador normalmente optimizará el temporal, por lo que no estará en ninguna parte).
Respondido 28 ago 12, 10:08
2
Supongo que estás preguntando por map<int, int>()
temporal.
No hay una diferencia fundamental con el caso cuando inicializa una variable local
int main()
{
map<int, int> a_map = map<int, int>();
...
}
El temporal se crea en la pila de main
función.
Cuando se crea un objeto estático que requiere inicialización no trivial, un compilador genera una función que se ejecuta antes main
. El temporal se crearía en la pila de esa función (si no se optimiza).
Respondido 28 ago 12, 10:08
0
Si te entendí bien, estás preguntando cómo se almacena la variable estática. Una variable estática es compartida por todas las instancias de la clase, pero es no almacenado "en" la clase, y es no una "parte" de la clase. En realidad, la forma en que se asignan las variables estáticas no se establece explícitamente en el estándar, por lo que pueden implementarse de diferentes maneras siempre que se comporten de acuerdo con el estándar (como estar disponibles sin un objeto).
El comportamiento de los miembros de una clase estática es muy parecido al de las variables globales. Puedes pensar de esocomo una abstracción, ¡no pretendo que sea así como realmente funciona!) como si hubiera una variable global en alguna parte, y cada miembro de la clase tuviera un puntero a esa variable global.
contestado el 23 de mayo de 17 a las 13:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c++ stl stack temp or haz tu propia pregunta.
¿Qué variable temporal? No hay variable temporal. - Šimon Tóth
@Let_Me_Be Formalmente,
A::m_map
se inicializa mediante la construcción de copias a partir del temporal en la expresión de inicialización. (Sin embargo, dudo que haya compilaciones que no eliden lo temporal en este caso). James Kanze