在C ++中是否存在一个称为堆栈的特定区域,其中存储了自动变量。
答案 0 :(得分:18)
没有。该标准仅提及:
- 静态存储持续时间
- 自动存储时间
- 动态存储时间
C ++中没有'堆栈内存'这样的东西。然而,通常会说自动存储持续时间变量是“在堆栈上分配”,因为它是从计算机科学的角度实现的。 “堆”是另一个术语,通常指动态存储持续时间,但标准中未提及。
答案 1 :(得分:3)
答案 2 :(得分:2)
这个问题似乎引发了关于正确答案是否是标准定义的问题,或者在大多数(如果不是全部)实现中实际完成的问题。让我回答一下,而不是继续嗤之以鼻。
一个简单的类比:假设你试图教某人开始地理学。有一次,学生问:“法国在欧洲吗?”您认为这个问题的正确答案是什么?
(a)否。法国宪法没有具体说明该国的边界。因此,不可能说法国在哪里。
(b)不可能。将来有一天地球将被摧毁,法国难民将在另一个星球上定居,并在那里重建他们的国家。或者可能存在法国位于不同地方的替代宇宙。因此,我们不能说法国在哪里。
(c)是的。法国在欧洲。
(d)基本上是的。法国的中央政府和大部分人口都在欧洲,尽管他们确实在其他地方控制着领土,如南美的法属圭亚那和印度洋的留尼旺岛。
如果问题是以一般方式或初学者提出的,或者(d)如果上下文表明需要更准确的答案,我会给出答案(c)。显然,这里的一些海报坚持认为正确答案是(a)或(b)。他们说,实际看世界是错误的,而问题的唯一正确答案是寻找一些描述世界的文件,就像一些权威所宣称的那样。
如果你认为这个类比很紧张而且你想要更纯粹的IT讨论,那么让我提供一个更接近的类比。假设您正在教授网页设计课程,学生问:“我如何在网页中表达复杂的数学公式?”
你会说正确的答案是,“使用< MATH>标记,它的关联标签如ABOVE和BELOW以及ROOT和ARRAY,如HTML 3.2标准中所定义。”
在HTML 3.2标准确实包含此类标记的意义上,这样的答案绝对正确。不幸的是,没有主流浏览器实现这些标签它在标准中的事实并没有太多实际用途。
我可以对IT产品的许多功能说同样的话。 “如何限制SQL查询的输出行数?”真正的答案取决于您使用的是哪个数据库引擎。我不知道SQL标准说的是什么,如果它提供任何手段,我不在乎,因为它无关紧要。在现实生活中,我没有在我的数据库服务器上运行ANSI SQL标准,我运行Postgres或Oracle或MySQL或其他一些实际产品。
我并不是说标准一般都不重要。当然,我们应该有很好的标准,产品应该尽可能地符合它们。但在现实世界中,最重要的是实施。
坚持认为计算机ACTUALLY在现实生活中的工作方式并不重要,但我们只能考虑某人如何认为它应该起作用,对于试图编写在真实计算机上运行的程序的人来说没有用。
(是的,如果您对跨平台兼容性和向上兼容性感兴趣,那么编写可与任何符合标准的编译器一起使用的程序的实际案例。我们当然可以辩论使用技巧的智慧这取决于具体的实现:非标准实现的脆弱性何时会超过性能或编码方便性?)
坦率地说,我认为这种答案是一种只会让初学者感到困惑的迂腐。当最初的学生询问法国大陆是什么时,他不想要或不需要一长串假设,理论和特殊情况。他需要一个简单直接的答案。当他问“我的函数变量是否存储在堆栈中?”时也是如此。或“我的程序是否在运行时加载到RAM中?”答案 3 :(得分:1)
模糊的问题,但是是的。 C ++中的程序堆栈通常在程序的虚拟地址空间中从高处开始,然后向下“移动”到程序堆的虚拟地址空间。
编辑:
因为我对此表示赞成已引起争议,我将附上答案。 C ++标准没有特别要求用于实现本地存储的堆栈。但是,如上所述,这是一种常见的实施方法。
答案 4 :(得分:-4)
请参阅this answer,我会在此详细解释。
总之,引自它:
术语“堆”和“堆栈”是 过时的,关于回来的时候 使用最流行的运行时库 这些数据结构用于存储对象 这是动态和 分别自动分配 (静态分配的对象适合 这两个类别都不是偶然的。
这些日子并非总是如此, 而且肯定没有强制要求 C ++标准,这并不关心 物品存放的地方。它只关心 关于它们是如何被创造出来的 毁了,他们有多久了 住。
希望能为你解决问题。