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

时间:2013-10-07 22:26:55

标签: c++ initialization

为什么标准决定在default initialization期间对非类型成员不执行任何操作,但在zero initialization期间执行value initialization

如果始终对非clss类型的成员执行零初始化会更安全吗?

4 个答案:

答案 0 :(得分:4)

如果您稍后要自己初始化数据,那么您不想支付将内存初始化为零而只是将其覆盖。

答案 1 :(得分:3)

我从未听过Bjarne或标准委员会的其他成员说语言安全是C ++语言设计的指导原则。当然,它适用于Java和其他语言,但C ++语言设计者更有可能支持效率:

  

C ++精益求精。基本原则是你不支付你不使用的东西。

- Bjarne Stroustrop

答案 2 :(得分:3)

该语言的设计基本原则之一是您不应该为不需要的东西付费。如果你想要你的成员初始化,你可以要求编译器这样做,但如果你不想这样做,成本将不会强加给你。

默认初始化只会初始化那些需要进行初始化的东西,即具有非平凡默认构造函数的成员,因为该构造函数用于设置一些重要的不变量。物体。请注意,区别不是类型与基本类型,而是是否存在一个简单的构造函数:

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
};

答案 3 :(得分:0)

如果始终对非clss类型成员执行零初始化会更安全吗?

否。

在调试配置中,使用陷阱表示大声抱怨更安全。不初始化值通常是更深层问题的征兆,因此通过零初始化和处理不正确的数据来掩盖这一隐患会使问题更难以诊断。