提问人:Luchian Grigore 提问时间:2/8/2012 最后编辑:trincotLuchian Grigore 更新时间:7/3/2021 访问量:13125
为什么在 C++ 内存管理中,术语“自动”和“动态”优先于术语“堆栈”和“堆”?
Why are the terms "automatic" and "dynamic" preferred over the terms "stack" and "heap" in C++ memory management?
问:
与 SO 上的许多问题和答案相关,我了解到最好将生存期管理为驻留在自动存储中而不是堆栈中的对象。
此外,动态分配的对象不应称为驻留在堆上,而应称为驻留在动态存储中。
我知道有自动、动态和静态存储,但从未真正理解自动堆栈和动态堆之间的区别。为什么前者更受欢迎?
我不是在问堆栈/堆是什么意思或内存管理如何工作。我想知道为什么术语自动/动态存储比术语堆栈/堆更受欢迎。
答:
自动/动态存储条款更可取,因为这是标准所要求的。堆栈/堆是基于实现的,理论上可以以另一种方式实现。
大多数实现使用堆栈来支持具有自动存储功能的对象。这不是标准要求的,但它在当今大多数 CPU 架构上都运行良好。
实现使用各种策略来支持具有动态存储持续时间的对象。我不确定堆是否是描述现代内存分配器使用的最佳方式,但这似乎是“历史”术语。
因此,自动/动态存储是标准用于对对象生命周期进行分类(“抽象”)的术语。如果您想按照标准描述对象来谈论它们,那么这些术语是正确的。
堆栈和堆是(“具体”)实现技术,可用于支持它们。使用这些术语不太正确,除非您谈论的是特定的实现。
从技术上讲,堆栈/堆分配是实现细节,而自动/动态存储是更通用的术语。该标准本身并不强制要求分配器必须使用堆栈/堆。因此,自动/动态是更恰当的术语,尽管我个人认为这种区别有点过于迂腐。
堆栈和堆将与实现相关的概念引入图片,而术语“自动”和“动态”则更为笼统
术语“静态存储持续时间”、“自动存储持续时间”和“动态存储持续时间”出现在 C++ 标准中。
术语“堆栈”和“堆”用于指代标准库(、、等)中与存储持续时间关系不大的功能。stack<>
make_heap()
push_heap()
评论
“自动”告诉我一些关于对象生存期的信息:具体来说,它会自动绑定到封闭范围,并且在该范围退出时会自动销毁。
Dynamic告诉我,对象的生存期不是由编译器自动控制的,而是由我直接控制的。
Stack 是一种容器类型的重载名称,也是 common 和 instructions 支持的相关流行指令指针协议的重载名称。它没有告诉我任何关于对象生存期的信息,除了通过与 C 语言中对象生存期的历史关联,这是由于流行的堆栈帧约定。
另请注意,在某些实现中,线程本地存储位于线程的堆栈上,但不限于任何单个函数的作用域。call
ret
Heap 又是一个重载的名称,表示一种排序容器或自由存储管理系统的类型。这不是所有系统上唯一可用的免费商店,它也没有告诉我任何关于分配了 的对象的生存期的任何具体信息。new
评论
boost::variant does
mmap
sbrk
评论