在c ++中初始化对象

时间:2010-06-14 05:01:10

标签: c++ object initialization

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

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

//file2.cpp ( link with file1.cpp)
extern j;
int i=10;  

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

3 个答案:

答案 0 :(得分:2)

实际上有不同的情况:

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

答案 1 :(得分:0)

正如您所说,编译器为变量分配存储空间。我认为初始化值也将在编译时完成,而不是在链接时。

答案 2 :(得分:0)

您的示例中没有对象,只有int s。如果通过“初始化”表示分配了它们的值,那么int将被转换为目标文件中数据部分中的字大小的条目,这些条目将使用其初始值进行硬编码。数据部分以及目标文件的其余部分由编译器创建,因此我认为您的问题的答案是编译时