¿Dónde está la variable temporal para la inicialización del mapa creada en el siguiente programa?

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?

preguntado el 28 de agosto de 12 a las 10:08

¿Qué variable temporal? No hay variable temporal. -

@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).

4 Respuestas

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

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

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

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.

Considere leer este y este preguntas sobre SO.

contestado el 23 de mayo de 17 a las 13:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.