编译器是否为自动对象和静态对象提供了不同的默认构造函数?
Does the compiler provides different default constructor for automatic & static objects?
我知道编译器提供的默认构造函数不会初始化 class & 结构的数据成员。
考虑以下示例:
#include <iostream>
struct Test
{
int a,b; // oops,still uninitialized
};
int main()
{
Test t; // compiler won't initialize a & b
std::cout<<t.a<<' ' <<t.b; // a & b has garbage values
}
但正如我们所知,如果对象是静态的,那么 class 成员将始终自动初始化为 0。
#include <iostream>
struct Test
{
int a,b; // both a & b will be 0 initialized
};
int main()
{
static Test t; // static object
std::cout<<t.a<<' ' <<t.b; // a & b will always be 0 by default
}
所以我的问题是:
1) 编译器是否为自动和静态对象提供了不同的默认构造函数?
2) 编译器会为以上两个程序生成不同的代码吗?
具有静态存储持续时间的对象总是在任何其他类型的初始化之前进行零初始化(参见 [basic.start.init])。具有自动存储持续时间的对象不是。构造函数与它无关。
根据我的研究,Class 提供了默认构造函数(无论如何)。因此,创建静态对象或普通对象并不重要。唯一的区别是局部变量的值已被初始化为零。
我知道编译器提供的默认构造函数不会初始化 class & 结构的数据成员。 考虑以下示例:
#include <iostream>
struct Test
{
int a,b; // oops,still uninitialized
};
int main()
{
Test t; // compiler won't initialize a & b
std::cout<<t.a<<' ' <<t.b; // a & b has garbage values
}
但正如我们所知,如果对象是静态的,那么 class 成员将始终自动初始化为 0。
#include <iostream>
struct Test
{
int a,b; // both a & b will be 0 initialized
};
int main()
{
static Test t; // static object
std::cout<<t.a<<' ' <<t.b; // a & b will always be 0 by default
}
所以我的问题是:
1) 编译器是否为自动和静态对象提供了不同的默认构造函数?
2) 编译器会为以上两个程序生成不同的代码吗?
具有静态存储持续时间的对象总是在任何其他类型的初始化之前进行零初始化(参见 [basic.start.init])。具有自动存储持续时间的对象不是。构造函数与它无关。
根据我的研究,Class 提供了默认构造函数(无论如何)。因此,创建静态对象或普通对象并不重要。唯一的区别是局部变量的值已被初始化为零。