【发布时间】:2013-10-14 16:15:14
【问题描述】:
为什么标准决定在default initialization 期间对非类类型成员不做任何事情,但在value initialization 期间执行zero initialization?
如果总是对非 clss 类型的成员执行零初始化会更安全吗?
【问题讨论】:
-
不用为不用的东西付费。
标签: c++ initialization
为什么标准决定在default initialization 期间对非类类型成员不做任何事情,但在value initialization 期间执行zero initialization?
如果总是对非 clss 类型的成员执行零初始化会更安全吗?
【问题讨论】:
标签: c++ initialization
该语言设计的基本原则之一是您不应该为不需要的东西付费。如果你想初始化你的成员,你可以要求编译器这样做,但如果你不想这样做,成本不会强加给你。
默认初始化只会初始化那些需要初始化的东西,即具有非平凡默认构造函数的成员,因为该构造函数旨在设置一些对物体。请注意,区别不是类类型与基本类型,而是是否存在平凡的构造函数:
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 类型的成员执行零初始化会更安全吗?
没有。
在调试配置中,使用大声抱怨的陷阱表示会更安全。不初始化值通常是更深层次问题的征兆,因此通过零初始化和继续使用不正确的数据来掩盖这一点会使问题更难诊断。
【讨论】: