36

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

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

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

我不是在问堆栈/堆是什么意思或内存管理是如何工作的。我在问为什么术语自动/动态存储优于术语堆栈/堆。

4

6 回答 6

44

Automatic告诉我有关对象生命周期的一些信息:特别是它自动绑定到封闭范围,并且在该范围退出时将自动销毁。

动态告诉我对象的生命周期不是由编译器自动控制的,而是在我的直接控制之下。

堆栈call是一种容器类型的重载名称,以及通用和指令支持的相关流行指令指针协议ret。由于流行的堆栈框架约定,它没有告诉我任何关于对象生命周期的信息,除非通过与 C 中对象生命周期的历史关联。另请注意,在某些实现中,线程本地存储位于线程的堆栈上,但不限于任何单个函数的范围。

又是一个重载名称,表示一种排序容器或自由存储管理系统。这不是所有系统上唯一可用的免费存储,也没有告诉我任何关于用new.

于 2012-02-07T19:05:15.277 回答
10

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

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

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

于 2012-02-07T18:47:43.927 回答
7

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

于 2012-02-07T18:43:05.683 回答
6

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

于 2012-02-07T18:47:45.783 回答
4

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

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

于 2012-02-07T18:56:25.050 回答
1

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

于 2012-02-07T18:54:35.757 回答