其中是在以下程序中创建的映射初始化的临时变量

时间:2012-08-28 09:48:22

标签: c++ stl stack temp

在以下代码段中。静态成员变量映射使用其默认构造函数进行初始化。

#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;
}

程序运行正常。我的问题是,为了初始化存储的静态映射而形成的临时变量在哪里?

4 个答案:

答案 0 :(得分:3)

编译器想要放置它的地方,只要它被破坏了 完整表达的结束。通常,它将在a的堆栈上 编译器生成的初始化函数,之前调用 main。 (实际上,在这种特殊情况下,编译器通常会这样做 优化临时离开,所以它不会在任何地方。)

答案 1 :(得分:3)

虽然,“詹姆斯”已恰当地回答了这个问题,但我只是想告诉你如何在g ++的情况下如何发生

这里有一些类似的代码用于回答:

[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;
}

现在当我们使用'TEST'编译时,取消定义&amp;看看'exe'的大小这是我们得到的

[Fooo@EXP]$ g++ -o TestStatic TestStatic.cpp
[Fooo@EXP]$ size TestStatic
   text    data     bss     dec     hex filename
   2724     300      12    3036     bdc TestStatic

现在我们用'TEST'定义......

来做
[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

观察BSS的差异

希望这能回答你的问题。

答案 2 :(得分:2)

我认为你问的是map<int, int>()临时的。

与初始化局部变量

的情况没有本质区别
int main()
{
    map<int, int> a_map = map<int, int>();
...
}

临时是在main函数的堆栈上创建的。

当创建需要非平凡初始化的静态对象时,编译器会生成一个在main之前执行的函数。临时将在该函数的堆栈上创建(如果没有优化)。

答案 3 :(得分:0)

如果我说得对,你问的是静态变量是如何存储的。静态变量由类的所有实例共享,但它存储在类中,并且不是类的“部分”。实际上,静态变量的分配方式并未在标准中明确说明,因此只要它们按照标准行事(如没有对象就可用),它们可以以不同的方式实现。

静态类成员的行为非常接近全局变量的行为。你可以想想它作为一个抽象,我不打算它真正起作用的方式!)好像在某个地方有一个全局变量,每个类成员有一个指向该全局的指针。

考虑在SO上阅读thisthis个问题。