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

where is the temporary variable for map initialization created in following program

本文关键字:映射 用于 初始化 变量 创建 程序      更新时间:2023-10-16

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

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

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

尽管"James"已经恰当地回答了这一问题,但我只想向您展示在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"进行编译时,undefine&看看"exe"的大小这就是我们得到的

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

现在我们用"测试"定义。。。

[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 的差异

希望这能回答你的问题。

编译器想把它放在哪里,只要它在完整表达式的末尾。通常,它将位于编译器生成的初始化函数,在CCD_ 1。(实际上,在这种特殊情况下,编译器通常会优化临时离开,这样它就不会出现在任何地方。)

我假设您询问的是关于map<int, int>()的临时问题。

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

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

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

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

如果我说得对,您会询问静态变量是如何存储的。静态变量由类的所有实例共享,但它不是存储在类中的,也不是类的"一部分"。实际上,静态变量的分配方式在标准中没有明确说明,所以只要它们按照标准运行,就可以用不同的方式实现(比如在没有对象的情况下可用)。

静态类成员的行为与全局变量的行为非常接近。你可能会认为是一个抽象,我不认为它是真正的工作方式!)就好像某个地方有一个全局变量,每个类成员都有一个指向该全局的指针。

考虑阅读SO.

上的这个和这个问题