【问题标题】:why c++ doesn't have default initialization [duplicate]为什么c ++没有默认初始化[重复]
【发布时间】:2016-04-26 10:56:18
【问题描述】:

例如,声明一个引用而不将其分配给某个东西会产生编译器错误,例如。 int &refVar; 但这不适用于指针。我知道 C++ 跳过了一些正常的默认功能,例如跳过边界检查等以提高速度,但这个理论并不适合指针变量。

为什么有人会声明一个指针变量而不是初始化它?为什么不NULL/0 甚至nullptr?大多数静态分析器实际上都指出了这个问题,但是定义这种未定义行为的可能原因是什么?这不是错误的重要来源吗?

【问题讨论】:

  • 公平地说,零初始化指针确实对性能有影响,尽管很小。
  • @VioletGiraffe ideone.com/DCptGZ
  • @oopaewem 那默认初始化(这是语言中定义明确的术语)。您的问题是“为什么默认初始化在某些情况下不进行初始化”。
  • 回到 45 年前运行在 1MHz 左右的 K&R PDP11,然后回到 30 年前运行 C++。 PC 以 4.77MHz 运行。 C 和 C++ 被设计为可移植的汇编程序,因此速度为王。我也有很多次使用指针,因为我不知道我希望它引用到哪里。将其初始化为任何东西都是没有意义的,例如我将使用工厂方法来决定我想要它是什么。在那些日子里,初始化也可能会产生一个 malloc 和默认构造函数,编译器不是现在的样子。

标签: c++ pointers c++11


【解决方案1】:

我认为这很可能是由于初始化这些变量的可能开销。对于一个变量来说,这可能不是什么大问题,但想象一下分配在堆栈上的数组。

【讨论】:

  • 事实上,由于实际或想象中的性能下降,C++ 直到今天还没有渗透到嵌入式系统中。 C 直到最近才被采用,因为 32 位架构可用。 8 位嵌入式世界仍然主要是用汇编语言编写的。 - 是的,除了要求最苛刻的应用程序之外,程序集正在迅速成为所有应用程序的传统。
【解决方案2】:

原因是性能。想象一下这样一种情况,您知道需要一个指针,但它指向不同的东西,具体取决于运行时变量。

int* ptr;

cin >> something;
switch(something)
{
    case 0: ptr = &a; break;
    case 1: ptr = &b; break;
    default: ptr = &c; break;
}

这里,默认初始化 ptr 可能会引入不必要的运行时开销。

【讨论】:

  • 这在实践中可能是错误的。大多数 优化 编译器会跳过初始化,因此在实践中您的示例没有运行时开销。
  • 他们可能会,就像他们对任何其他类型的变量一样。关键是默认初始化不是默认初始化,它允许编译器更积极地优化并避免引入不必要的(尽管在实践中微不足道)初始化开销。
  • @BasileStarynkevitch,我刚刚遇到了一个与 MSVC 相关的问题,另一个团队中的某个人将构建设置为将使用未初始化的变量视为错误而不是警告。 GCC、ICC 和其他人可以很容易地看到该变量是在与分配它相同的条件下使用的。但它需要在分配或使用它的条件之外声明(未初始化)。 MSVC 看不到使用条件与分配条件匹配,因此它需要初始化它不会优化。
【解决方案3】:

很有可能,因为 C++ 想要与 C 非常兼容(或者至少,旧版本的 C++ 想要与 C99 兼容)。

顺便说一句(作为个人编码规则,可以讨论),我尝试在 C 和 C++ 中初始化任何 scalar 变量。如果不需要该初始化,优化编译器将删除它。否则,它有助于为我的程序提供更具确定性的行为。

【讨论】:

    【解决方案4】:

    这只是出于历史原因。在过去,当编译器优化还很初级,C++ 刚刚被引入时,作者需要确保 C++ 代码与 C 代码一样快,而没有使用 C++ 特性。否则,没有人会迁移到它。

    所以他们制定了这条规则来遵循 C 套件 - 自动 变量没有默认初始化(例如,静态仍然默认初始化)。当然,现在很容易为每个标量要求一个初始化器并默认初始化它,除非在稍后在代码中使用之前进行初始化,但没有人有精力这样做。

    【讨论】:

      猜你喜欢
      • 2021-06-13
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      相关资源
      最近更新 更多