为什么C++默认初始化不对非类类型成员进行零初始化
Why C++ default initialization doesn't zero-initialize non-class type members
为什么标准决定在默认初始化期间不对非类类型成员执行任何操作,但在值初始化期间执行零初始化?
如果始终在非 clss 类型的 memeber 上执行零初始化会更安全吗?
语言
设计的基本原理之一是你不应该为你不需要的东西付费。如果您希望初始化成员,可以要求编译器这样做,但如果您不希望这样做,则不会强制将成本强加给您。
默认初始化将仅初始化那些需要初始化的内容,即具有非平凡默认构造函数的成员,因为该构造函数旨在设置一些对对象很重要的不变量。请注意,区别不在于类类型与基本类型,而在于是否存在一个微不足道的构造函数:
struct POD { int a; int b; int c; };
struct V { virtual void f(); };
struct Type {
std::string str; // default initialization calls default constructor
V obj; // " calls default constructor: vptr must be set
POD pod; // default initialization leaves this untouched
};
如果您稍后要自己初始化数据,那么您不想为将内存初始化为零而付费,只是为了覆盖它。
我从未听过Bjarne或标准委员会的其他成员说语言安全是C++语言设计的指导原则。当然,它是针对Java和其他语言的,但C++语言设计者更有可能支持效率:
C++是精干而刻薄的。基本原则是,您不会为不使用的东西付费。
-比亚恩·斯特劳斯特罗普
如果始终在非 clss 类型的 memeber 上执行零初始化会更安全吗?
不。
在调试配置中,使用大声抱怨的陷阱表示形式会更安全。不初始化值通常是更深层次问题的症状,因此通过零初始化和继续使用不正确的数据来掩盖它会使问题更难诊断。
相关文章:
- 为什么在C++中首先初始化成员类
- 是否可以防止省略聚合初始化成员?
- 正在复制具有未初始化成员的结构
- 使用大括号或括号初始化成员变量
- C++结构:强制初始化成员?
- C++中未初始化成员布尔变量的默认值是多少?
- 使用默认值初始化成员引用
- 在构造函数中初始化成员时,是否应该在成员上使用 std::move?
- C++使用 { } 初始化成员变量
- 如何根据构造函数参数使用超类类型初始化成员变量?
- OpenGL C++:VBO 的结构包装器不会初始化成员
- 有没有办法在Brace中初始化成员
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 通常应用方法,使用带有构造函数委托的 SFINAE 通过类模板的构造函数初始化成员
- 如何在嵌套类中初始化成员?C
- 是否可以在构造函数主体中初始化成员变量,而不是初始值设定项列表
- 编译器错误,因为构造函数必须显式初始化成员
- 如何使用成员函数初始化成员函数指针
- C 如何使用隐藏的默认构造函数初始化成员