为什么术语"自动"和"动态"优于C++内存管理中的"堆栈"和"堆"这两个术语?

Luc*_*ore 22 c++ heap stack automatic-storage

与SO上的很多问题和答案相关,我已经了解到最好引用其生命周期被管理为驻留在自动存储而不是堆栈中的对象.

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

我知道有自动,动态和静态存储,但从来没有真正理解自动堆栈和动态堆之间的区别.为什么前者更受青睐?

我不是在询问堆栈/堆的含义或内存管理的工作原理.我问为什么术语自动/动态存储优于术语堆栈/堆.

Use*_*ess 32

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

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

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

是一个重载的名称,表示一种类型的已排序容器或一个免费商店管理系统.这不是所有系统上唯一可用的免费商店,也不会告诉我有关分配对象的生命周期的具体内容new.


Mat*_*Mat 9

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

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

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


Asa*_*saf 6

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


Kri*_*son 6

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

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


Gri*_*zly 5

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