c++ - 为什么零初始化不是 c++ 中非初始化变量的默认值?是否有强制执行它的编译器选项?

标签 c++

在我所知道的大多数语言中,标量类型变量默认情况下是零初始化的,如果它们没有在代码中初始化的话。 为什么这不会发生在 c/c++ 中?我能想到的唯一原因是性能,但是

  • 如果我对其进行初始化,它真的会消耗性能吗?
  • 最好有未定义的行为吗?
  • 如果我想避免未定义的行为,无论如何我都必须初始化它,那么我赢了什么?

如果这可能是性能问题,以某种方式明确告诉编译器不要对变量进行零初始化会不会更容易?

最后是我的问题: 是否有 gcc 选项告诉编译器默认零初始化?

最佳答案

C++ 的创始原则之一是不强制开发人员为他们不使用的东西付费。如果你写类似 int x; x = 1; 那么您不必为 x 的零初始化付费,即使该费用恰好非常小。

编辑:关于你的另外两点

is it preferable to have undefined behavior?

未定义的行为在语言中不一定是坏事(你可以两种方式争论)。如果您编写导致它的代码,那绝对是一件坏事。值得注意的是,它为实现者提供了更多自由,并实现了重要的优化。

if I want to avoid undefined behavior, I have to initialize it anyway, so what did I win?

有一个未初始化的变量不是未定义的行为。尝试读取一个是未定义的行为。

关于c++ - 为什么零初始化不是 c++ 中非初始化变量的默认值?是否有强制执行它的编译器选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55496214/

相关文章:

c++ - 传递函数参数的求值顺序 - F1( int F2( int& x ), int x ) 的操作顺序

c++ - bool递归函数中的真/假优先级

c++ - 自动 void * 到 C++ 类转换

c# - 将 C# 类序列化为二进制以供 C++ 使用。如何处理对齐?

c++ - 在2D vector 中使用第三个[]有什么目的?

c++ - 使用返回另一个翻译单元中定义的占位符类型的函数

c++ - 使用 wmemset() 的代码可移植性如何?

c++ - 如何禁用在第三方代码中重新启用的警告?

c++ - 当函数几乎为 "flat"时,牛顿-拉夫森方法不可能实现

java - 16 位灰度的 tiff 规范