繁体   English   中英

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

[英]Why are the terms “automatic” and “dynamic” preferred over the terms “stack” and “heap” in C++ memory management?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM