【问题标题】:Why C++ default initialization doesn't zero-initialize non-class type members为什么 C++ 默认初始化不会对非类类型成员进行零初始化
【发布时间】:2013-10-14 16:15:14
【问题描述】:

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

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

【问题讨论】:

  • 不用为不用的东西付费。

标签: c++ initialization


【解决方案1】:

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

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

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

【讨论】:

  • 我明白了,但只是为了争论,实际上总是进行零初始化会花费多少?所有的编译器实现都会遵守这条规则吗?
  • @swang:成员的值是未定义的,所以实现可以做它想做的事。调试模式下的一些实现接受成本并将其初始化为 0(或一些易于识别的垃圾值)。由于标准没有承诺价值将是什么,因此实施可以使其成为任何东西。费用是多少?在大多数情况下可能很小,但是一旦出现一种明显的情况,您就不能将您的选择强加给用户。大多数实现都遵循优化构建中的规则(即不会初始化)。
【解决方案2】:

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

【讨论】:

  • 所以纯粹是为了效率?那么为什么值初始化不同呢?
  • @swang:这样你就可以花钱买了。
【解决方案3】:

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

C++ 精益求精。基本原则是不用为不用的东西付费。

-Bjarne Stroustrop

【讨论】:

    【解决方案4】:

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

    没有。

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

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 2021-12-16
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      相关资源
      最近更新 更多