其中是在以下程序中创建的用于映射初始化的临时变量
where is the temporary variable for map initialization created in following program
在下面的代码片段中。静态成员变量映射使用其默认构造函数进行初始化。
#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.
相关文章:
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 如何编写用于多映射插入和擦除功能的 API?
- 用于对项目进行分组并将单个项目映射到其他组成员的数据结构
- 用于使用可选输入文件运行 C++ 的 VIM 映射
- 生成器用于提升::融合::使用不可复制的值类型进行映射初始化
- 为什么 c++ 映射的运算符<不适用于 <=
- 什么是最快的解决方案,用于读/写入哈希映射
- SWIG 多参数类型映射适用于函数,但如果有多个构造函数,则不适用于构造函数
- qtCreator 错误:无法映射文件,errno=22 文件用于架构x86_64?
- 如何将 SWIG 用于 STL 映射
- 重载 [ ] 运算符用于 C++ 中的 stl 映射
- 安全方便的通用散列(用于 STL 无序集和映射)习语?
- 用于读取输入文件的内存映射文件的安全
- 没有用于引用映射的可行重载运算符
- 缺少用于映射初始化的构造函数
- 通常用于将输入映射到显示器的数据结构是什么
- 用于设置相关类属性的映射的合理键类型
- 其中是在以下程序中创建的用于映射初始化的临时变量
- 用于键入运行时映射的值
- 哈希映射适用于X个元素