根据stackoverflow上的许多问题和答案,我了解到引用生命周期由自动存储管理的对象比堆栈中的对象更好。
此外,动态分配的对象不应称为位于堆上,而应称为位于动态存储器上。
我知道有自动、动态和静态存储器,但从未真正理解自动-堆栈和动态-堆之间的区别。为什么前者更受欢迎?
我不是在问堆栈/堆的含义或内存管理的工作原理。我在问为什么首选术语“自动/动态存储器”而不是“堆栈/堆”。
根据stackoverflow上的许多问题和答案,我了解到引用生命周期由自动存储管理的对象比堆栈中的对象更好。
此外,动态分配的对象不应称为位于堆上,而应称为位于动态存储器上。
我知道有自动、动态和静态存储器,但从未真正理解自动-堆栈和动态-堆之间的区别。为什么前者更受欢迎?
我不是在问堆栈/堆的含义或内存管理的工作原理。我在问为什么首选术语“自动/动态存储器”而不是“堆栈/堆”。
Automatic向我传达了有关对象生命周期的信息:特别是它自动绑定到封闭作用域,并在该作用域退出时被自动销毁。
Dynamic告诉我,对象的生存期不会由编译器自动控制,而是在我的直接控制下。
Stack是一个一种容器类型的重载名称,并且与常见的 call
和 ret
指令支持的相关流行指针协议相关。它并未详细说明对象的生命周期,除了通过与C中的对象生命周期的流行堆栈帧约定的历史联系之外。
还要注意,在某些实现中,线程本地存储在线程的堆栈上,但不限于任何单个函数的范围。
Heap再次是一个重载名称,表示一种排序容器类型或自由存储区管理系统。这不是所有系统上唯一的自由存储区,也没有具体说明使用new
分配的对象的生命周期。
boost::variant
就是这样做的)。 - Mooing Duckmmap
或sbrk
,都可以计算在内。 - Useless从技术角度来说,栈/堆分配是实现细节,而自动/动态存储则是更通用的术语。标准本身并没有规定分配器必须使用栈/堆。因此,自动/动态是更合适的术语,尽管个人认为这种区分有点过于追求小节。
在C++标准中出现了“静态存储期”,“自动存储期”和“动态存储期”的术语。
“堆栈”和“堆”这些术语用于指称标准库中的特性(stack<>
,make_heap()
,push_heap()
等),这与存储期没有太大关系。
栈和堆引入了与实现相关的概念,而术语“自动”和“动态”则更为通用。