为什么C++编译器不将每个整数声明初始化为0,是本地的还是全局的或成员? P>为什么C++编译器不将每个整数声明初始化为0,是本地的还是全局的或成员的?为什么内存模型中存在未初始化的部分?

为什么C++编译器不将每个整数声明初始化为0,是本地的还是全局的或成员? P>为什么C++编译器不将每个整数声明初始化为0,是本地的还是全局的或成员的?为什么内存模型中存在未初始化的部分?,c++,compiler-construction,C++,Compiler Construction,我知道这是一个枯燥的答案,但你的问题恰恰说明了这一点: 因为C++标准是这样说的。 为什么会这样说?因为C++是建立在一个原则上的: 不要为你不用的东西付钱 将内存设置为某个值会消耗CPU时间和内存带宽。如果你想这样做,就明确地去做。变量声明不应产生此成本。我知道这是一个枯燥的答案,但您的问题恰恰要求: 因为C++标准是这样说的。 为什么会这样说?因为C++是建立在一个原则上的: 不要为你不用的东西付钱 将内存设置为某个值会消耗CPU时间和内存带宽。如果你想这样做,就明确地去做。变量声明不应产生

我知道这是一个枯燥的答案,但你的问题恰恰说明了这一点:

因为C++标准是这样说的。 为什么会这样说?因为C++是建立在一个原则上的:

不要为你不用的东西付钱


将内存设置为某个值会消耗CPU时间和内存带宽。如果你想这样做,就明确地去做。变量声明不应产生此成本。

我知道这是一个枯燥的答案,但您的问题恰恰要求:

因为C++标准是这样说的。 为什么会这样说?因为C++是建立在一个原则上的:

不要为你不用的东西付钱


将内存设置为某个值会消耗CPU时间和内存带宽。如果你想这样做,就明确地去做。变量声明不应产生这种成本。

C++基于C,而在C中,主要的设计问题是代码效率。在大多数情况下,您希望在声明新变量后将其初始化为特定值。当编译器将0写入该内存地址,只是在不久之后将另一个值写入该地址时,这将浪费CPU周期


当然,智能编译器可以在变量被赋值之前检测到它没有被读取,并且可以将初始化优化为0。但当C语言被开发出来时,编译器还没有那么聪明


C语言及其标准库通常遵循的原则是,在某些情况下可能不需要自动执行某些操作时,它不会自动执行这些操作。

C++基于C语言,而在C语言中,主要的设计问题是代码效率。在大多数情况下,您希望在声明新变量后将其初始化为特定值。当编译器将0写入该内存地址,只是在不久之后将另一个值写入该地址时,这将浪费CPU周期


当然,智能编译器可以在变量被赋值之前检测到它没有被读取,并且可以将初始化优化为0。但当C语言被开发出来时,编译器还没有那么聪明


<> P> C语言及其标准库一般遵循的原则是,当某些情况下不需要做时,它自动地不做事情。

< P>如果它确实可以,那么它会使你的生活更容易,但是C++避免了开销。例如,设置值,然后你可能会重置为其他东西。

< P>如果你这样做,它可能会让你的生活更容易,但是在避免开销的方面,C++错误会更容易。例如,设置值,您可能会重置为其他东西。

因为C++是这样指定工作的,因为这样做是有代价的,并且通常变量的初始值不需要是零,并且将其设置为零,而不是所需的值并不比它具有未定义的值要好。静态链接全局、局部静态等不使用零填充进行初始化;因为这就是语言的设计方式。我可以很容易地问为什么全局/静态被归零,而不是像局部变量一样对待。至于你的第二个问题:因为没有人检查RAM空闲内存并将其设置为0s a,这是无用的b,它会消耗内存带宽和cpu。也没有人关心未初始化的垃圾内存值,因为它是由你在你的程序中初始化他们,因为你需要它,你并不总是需要他们是0,甚至在50%的时间在我的经验。如果你不初始化它们,你就应该预料到生命中的事情是如何定义的行为,因为LaveVioOne将毫无理由地做艰苦的工作,尤其是当它杀死性能时,这就是GR8 IMO。因为C++就是这样指定工作的,因为这样做是有代价的,并且通常不需要变量的初始值。为零并将其设置为零而不是您想要的值并不比具有未定义的值好多少;因为这就是语言的设计方式。我可以很容易地问为什么全局/静态被归零,而不是像局部变量一样对待。至于你的第二个问题:因为没有人检查RAM空闲内存并将其设置为0s a,这是无用的b,它会消耗内存带宽和cpu。也没有人关心未初始化的垃圾内存值,因为它是由你在你的程序中初始化他们,因为你需要它,你并不总是需要他们是0,甚至在50%的时间在我的经验。如果你不初始化它们,你应该期待未定义的行为,这就是生活中的工作方式。est la vienoone会无缘无故地做艰苦的工作,特别是当它扼杀性能时——这是gr8 imo.+1,但我认为更好的原则措辞应该是只支付
r你使用什么,或者不为你不使用的东西付费。这些语言背后没有一个合理、一致的计划。如果C/C++实际上是为付费而设计的,那么在文件范围内就不会有静态存储变量的零输出初始化。数组中未显式初始化的项不会有隐式零。不会有隐式类型的提升。等等所以,C和C++都是建立在原理上的,编程很有趣!让我们做一门语言!把一些随机的东西放在一起,看看我们最终会得到什么。@Angew你是对的,我想不出这两个短语。今天的成本可能可以忽略不计;编译器可能会优化掉大部分(如果不是全部的话)不必要的初始化。在制定规则时,这是一个性能问题。至于静态:初始化无论如何都是必要的,由操作系统完成。出于安全原因,您永远不会从操作系统收到未初始化的内存。@Lundin我之所以这么说,主要是因为评论不是为了进行长时间的讨论。+1,但我认为更好的原则是只为您使用的内容付费,或者不为您不使用的内容付费。这些语言背后没有合理、一致的计划。如果C/C++实际上是为付费而设计的,那么在文件范围内就不会有静态存储变量的零输出初始化。数组中未显式初始化的项不会有隐式零。不会有隐式类型的提升。等等所以,C和C++都是建立在原理上的,编程很有趣!让我们做一门语言!把一些随机的东西放在一起,看看我们最终会得到什么。@Angew你是对的,我想不出这两个短语。今天的成本可能可以忽略不计;编译器可能会优化掉大部分(如果不是全部的话)不必要的初始化。在制定规则时,这是一个性能问题。至于静态:初始化无论如何都是必要的,由操作系统完成。出于安全原因,您永远不会从操作系统接收到未初始化的内存。@Lundin我这么说主要是因为注释不是用于长时间讨论的。@TonyD这种情况很少见,而且涉及的代码非常复杂,额外初始化的成本可以忽略不计。当然,智能编译器可以在变量被赋值之前检测到它没有被读取,并且可以将初始化优化为0在许多情况下,这是正确的,但初始化是否正确可能取决于运行时变量,有时静态分析在理论上是可能的,但代价高昂。跟踪函数之间的初始化也是相当棘手的。抱歉-略微编辑并移动了我先前的评论@JamesKanze这是在过分地贬低困难。。。考虑:int x[10000];无效fint*;外汇;-没有什么特别复杂的,但是在调用方中初始化相对比较昂贵,因为f可能会做得很好,或者抛出或指示不应该使用数组的东西。@TonyD这种情况很少见,并且涉及的代码复杂到可以忽略额外初始化的成本。当然,智能编译器可以在变量被赋值之前检测到它没有被读取,并且可以将初始化优化为0在许多情况下,这是正确的,但初始化是否正确可能取决于运行时变量,有时静态分析在理论上是可能的,但代价高昂。跟踪函数之间的初始化也是相当棘手的。抱歉-略微编辑并移动了我先前的评论@JamesKanze这是在过分地贬低困难。。。考虑:int x[10000];无效fint*;外汇;-没有什么特别复杂的,但是在调用方中初始化相对比较昂贵,因为f可能无论如何都会做得很好,或者抛出一些表示不应该使用数组的东西。