0

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

#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

4 回答 4

3

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

于 2012-08-28T09:57:13.387 回答
3

Although, It has been aptly answered by "James", I just want to show you how shall how that shall happen in case of g++

here is some analogous code for the purpose of answer:

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

now when we compile with 'TEST' undefine & see the size of the 'exe' this is what we get

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

Now we do it with 'TEST' Define ...

[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 the difference in BSS

hope this answers your question.

于 2012-08-29T06:11:43.903 回答
2

我假设你问的是map<int, int>()临时的。

与初始化局部变量的情况没有根本区别

int main()
{
    map<int, int> a_map = map<int, int>();
...
}

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

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

于 2012-08-28T09:59:59.467 回答
0

如果我没听错,那么您是在询问静态变量的存储方式。静态变量由类的所有实例共享,但它存储在类“中”,也不是类的“部分”。实际上,静态变量的分配方式并没有在标准中明确说明,因此只要它们的行为符合标准,它们就可以以不同的方式实现(比如在没有对象的情况下可用)。

静态类成员的行为非常接近全局变量的行为。您可能会认为它(作为一种抽象,我并不打算让它成为它真正工作的方式!)好像某处有一个全局变量,并且每个类成员都有一个指向该全局变量的指针。

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

于 2012-08-28T09:55:22.167 回答