在c ++中初始化对象

Hap*_*tal 5 c++ initialization object

我想知道,在c ++中,对象的初始化何时发生?
是在编译时还是链接时?
例如:

//file1.cpp
extern int i;
int j=5;

//file2.cpp ( link with file1.cpp)
extern j;
int i=10;  
Run Code Online (Sandbox Code Playgroud)

现在,编译器做了什么:根据我的说法,它为变量分配存储空间.
现在我想知道:
它是否也将初始化值放在该存储中,还是在链接时完成?

jde*_*aan 2

其实也有不同的情况:

  • 全局变量或静态变量(不是类):这些值存储在 exe/dll 的 init 部分中。这些值是由链接器根据编译的目标文件信息创建的。(加载初始化+将dll/exe映射到内存中)
  • 局部非静态变量:这些值由编译器通过将这些值放入堆栈上来设置(在 x86 上压入/弹出)(编译器初始化)
  • 对象:内存保留在堆栈上,实际的值设置推迟到对构造函数的调用(运行时初始化)
  • 指向对象的指针(实际上不是新情况):仅为指针保留空间。指向的对象仅在调用 new 后才存在,该 new 保留内存并调用构造函数对其进行初始化(运行时初始化)