首页 / 知识

全局内存是否在C ++中初始化?

2023-04-15 05:25:00

全局内存是否在C ++中初始化?

Is global memory initialized in C++?

全局内存是否在C ++中初始化? 如果是这样,怎么办?

(第二)澄清:

当程序启动时,在初始化原语之前,将成为全局内存的存储空间中有什么? 我试图了解它是否被清零,例如垃圾。

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

1
MySingleton* MySingleton::_instance = NULL;

并得到两个单例实例?

请参阅有关单例的多个实例的C ++测验...


从标准:

Objects with static storage duration (3.7.1) shall be zero-initialized (8.5) before any other initialization takes place. Zero-initialization and initialization with a constant expression are collectively called static initialization; all other initialization is dynamic initialization. Objects of POD types (3.9) with static storage duration initialized with constant expressions (5.19) shall be initialized before any dynamic initialization takes place. Objects with static storage duration defined in namespace scope in the same translation unit and dynamically initialized shall be initialized in the order in which their definition appears in the translation unit. [Note:8.5.1 describes the order in which aggregate members are initialized. The initial-
ization of local static objects is described in 6.7.]

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


是的,全局原语被初始化为NULL。

例:

1
2
3
4
5
6
7
8
int x;

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

您不能对堆上的类,结构,数组,内存块进行任何假设...

总是初始化所有内容是最安全的。


来自嵌入式世界...

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

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


始终至少在VC ++下初始化使用静态/全局范围声明的变量。

在某些情况下,以下两者之间的行为实际上可能有所不同:

1
2
3
int x = 0;

int main() { ... }

1
2
3
int x;

int main() { ... }

如果使用共享数据段,则VC ++至少会使用显式初始化和#pragma data_seg的存在来确定某个特定变量是用于进程的共享数据段还是专用数据段。

为了获得更多乐趣,请考虑一下,如果您有一个静态C ++对象,并且在共享数据段中声明了构造函数/析构函数。每当exe / dll附加到数据段时(几乎肯定不是您想要的),都会调用构造函数/析构函数。

此知识库文章中的更多详细信息


初始化内存原语调用

最新内容

相关内容

猜你喜欢