在以下代码段中。静态成员变量映射使用其默认构造函数进行初始化。
#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;
}
程序运行正常。我的问题是,为了初始化存储的静态映射而形成的临时变量在哪里?
答案 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)