为什么在 C++ 内存管理中,术语“自动”和“动态”优先于术语“堆栈”和“堆”?

Why are the terms "automatic" and "dynamic" preferred over the terms "stack" and "heap" in C++ memory management?

提问人:Luchian Grigore 提问时间:2/8/2012 最后编辑:trincotLuchian Grigore 更新时间:7/3/2021 访问量:13125

问:

与 SO 上的许多问题和答案相关,我了解到最好将生存期管理为驻留在自动存储中而不是堆栈中的对象。

此外,动态分配的对象不应称为驻留在堆上,而应称为驻留在动态存储中。

我知道有自动、动态和静态存储,但从未真正理解自动堆栈和动态堆之间的区别。为什么前者更受欢迎?

我不是在问堆栈/堆是什么意思或内存管理如何工作。我想知道为什么术语自动/动态存储比术语堆栈/堆更受欢迎。

C++ 堆内存 堆栈内存 自动存储

评论

0赞 NPE 2/8/2012
我认为以下不能回答您的问题?stackoverflow.com/questions/408670/stack-static-and-heap-in-c
1赞 Luchian Grigore 2/8/2012
@aix它没有。或者至少它没有说一个术语比另一个术语更受欢迎,或者有什么区别。
0赞 NPE 2/8/2012
C++ 中正确堆栈和堆用法的可能重复?
3赞 jrok 2/8/2012
我一直认为这是因为标准没有规定自动存储持续时间必须像堆栈一样实现。
2赞 NPE 2/8/2012
@LuchianGrigore:在编辑之前,我完全不清楚这个问题是关于术语的,而不是别的。从评论/答案来看,其他人也不清楚。

答:

7赞 Asaf 2/8/2012 #1

自动/动态存储条款更可取,因为这是标准所要求的。堆栈/堆是基于实现的,理论上可以以另一种方式实现。

13赞 Mat 2/8/2012 #2

大多数实现使用堆栈来支持具有自动存储功能的对象。这不是标准要求的,但它在当今大多数 CPU 架构上都运行良好。

实现使用各种策略来支持具有动态存储持续时间的对象。我不确定是否是描述现代内存分配器使用的最佳方式,但这似乎是“历史”术语。

因此,自动/动态存储是标准用于对对象生命周期进行分类(“抽象”)的术语。如果您想按照标准描述对象来谈论它们,那么这些术语是正确的。
堆栈和堆是(“具体”)实现技术,可用于支持它们。使用这些术语不太正确,除非您谈论的是特定的实现。

9赞 Grizzly 2/8/2012 #3

从技术上讲,堆栈/堆分配是实现细节,而自动/动态存储是更通用的术语。该标准本身并不强制要求分配器必须使用堆栈/堆。因此,自动/动态是更恰当的术语,尽管我个人认为这种区别有点过于迂腐。

1赞 Jannat Arora 2/8/2012 #4

堆栈和堆将与实现相关的概念引入图片,而术语“自动”和“动态”则更为笼统

6赞 Kristopher Johnson 2/8/2012 #5

术语“静态存储持续时间”、“自动存储持续时间”和“动态存储持续时间”出现在 C++ 标准中。

术语“堆栈”和“堆”用于指代标准库(、、等)中与存储持续时间关系不大的功能。stack<>make_heap()push_heap()

评论

0赞 Luchian Grigore 2/8/2012
很抱歉对你之前的回答投了反对票,我意识到这个问题是模棱两可的。+1
59赞 Useless 2/8/2012 #6

“自动”告诉我一些关于对象生存期的信息:具体来说,它会自动绑定到封闭范围,并且在该范围退出时会自动销毁。

Dynamic告诉我,对象的生存期不是由编译器自动控制的,而是由我直接控制的。

Stack 是一种容器类型的重载名称,也是 common 和 instructions 支持的相关流行指令指针协议的重载名称。它没有告诉我任何关于对象生存期的信息,除了通过与 C 语言中对象生存期的历史关联,这是由于流行的堆栈帧约定。 另请注意,在某些实现中,线程本地存储位于线程的堆栈上,但不限于任何单个函数的作用域。callret

Heap 又是一个重载的名称,表示一种排序容器或自由存储管理系统的类型。这不是所有系统上唯一可用的免费商店,它也没有告诉我任何关于分配了 的对象的生存期的任何具体信息。new

评论

0赞 Mooing Duck 2/14/2012
另外值得一提的是:并非所有系统都使用“堆栈”来实现非递归函数。另外:可以在“堆栈”上创建动态对象(我认为是这样)。boost::variant does
0赞 AlwaysLearning 1/3/2020
还有哪些免费商店?实际上,在什么意义上,免费存储是免费的,而堆栈内存不是免费的?
1赞 Useless 1/3/2020
“免费存储”仅指“可以分配的可用(内存)资源存储”。因此,任何特定于系统的内存分配方式(例如 或 )都算在内。mmapsbrk
0赞 Useless 1/3/2020
除了作为可选的实现细节之外,堆栈内存一方面是由这些特定于系统的分配器之一返回的普通内存(除非它不像 SPARC 上那样,或者当它不存在时),另一方面是处理(取消)分配该内存的方法。