为什么C++默认初始化不对非类类型成员进行零初始化

Why C++ default initialization doesn't zero-initialize non-class type members

本文关键字:初始化 成员 类型 C++ 默认 为什么      更新时间:2023-10-16

为什么标准决定在默认初始化期间不对非类类型成员执行任何操作,但在值初始化期间执行零初始化?

如果始终在非 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 上执行零初始化会更安全吗?

不。

在调试配置中,使用大声抱怨的陷阱表示形式会更安全。不初始化值通常是更深层次问题的症状,因此通过零初始化和继续使用不正确的数据来掩盖它会使问题更难诊断。