全局内存是用C++初始化的吗?

the*_*zer 13 c++ memory memory-management

全局内存是用C++初始化的吗?如果是这样,怎么样?

(二)澄清:

当程序启动时,在初始化基元之前,内存空间中的内容将成为全局内存?我试图了解它是否被清零,或者例如垃圾.

情况是:可以instance()在初始化之前通过调用设置单例引用:

MySingleton* MySingleton::_instance = NULL;
Run Code Online (Sandbox Code Playgroud)

并获得两个单例实例?

在单个多个实例上查看我的C++测验...

Der*_*ark 18

从标准:

具有静态存储持续时间(3.7.1)的对象应在任何其他初始化发生之前进行零初始化(8.5).使用常量表达式进行零初始化和初始化统称为静态初始化 ; 所有其他初始化是动态初始化.具有用常量表达式(5.19)初始化的静态存储持续时间的POD [普通旧数据]类型(3.9)的对象应在任何动态初始化发生之前初始化.在同一翻译单元的命名空间范围内定义并动态初始化的静态存储持续时间的对象应按其定义出现在翻译单元中的顺序进行初始化.[注意:8.5.1描述了初始化聚合成员的顺序.6.7中描述了本地静态对象的初始化.

所以是的,具有静态存储持续时间的全局变量将被初始化.例如,在堆上分配的全局变量当然不会自动初始化.


Bri*_*ndy 8

是全局基元初始化为NULL.

例:

int x;

int main(int argc, char**argv)
{
  assert(x == 0);
  int y;
  //assert(y == 0); <-- wrong can't assume this.
}
Run Code Online (Sandbox Code Playgroud)

你不能对堆上的类,结构,数组,内存块做出任何假设......

始终初始化所有内容是最安全的.

  • 内置类型没有构造函数; 他们是POD.比如"int i = int();" 或者成员初始化列表中的int_member()看起来像构造函数调用,实际上称为"值初始化". (3认同)
  • 布兰坦,你不能依赖它.该标准不要求非静态变量为零初始化.大多数编译器都*不*初始化非静态变量,因为它会产生运行时成本. (2认同)

Jef*_*ffV 7

来自嵌入式世界......

您的代码被编译为三种类型的内存:
1.数据:初始化内存
2. .text:常量和代码
3. .bss:未初始化的内存(如果没有显式初始化,则在C++中初始化为0)

如果初始化,全局变量将进入.data.如果不是,则将它们放在.bss中,并在premain代码中归零.