Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这些术语是;“自动”;及;“动态”;“优先于条款”;堆栈";及;堆;在C++;内存管理?_C++_Stack_Heap_Automatic Storage - Fatal编程技术网

C++ 为什么这些术语是;“自动”;及;“动态”;“优先于条款”;堆栈";及;堆;在C++;内存管理?

C++ 为什么这些术语是;“自动”;及;“动态”;“优先于条款”;堆栈";及;堆;在C++;内存管理?,c++,stack,heap,automatic-storage,C++,Stack,Heap,Automatic Storage,与许多问题和答案相关,我了解到最好将其生命周期管理为驻留在自动存储中的对象,而不是堆栈中的对象 另外,动态分配的对象不应该被称为驻留在堆上,而是在动态存储中 我知道有自动、动态和静态存储,但从未真正理解自动堆栈和动态堆之间的区别。为什么选择前者 我不是问堆栈/堆是什么意思,也不是问内存管理是如何工作的。我在问为什么术语自动/动态存储比术语堆栈/堆更受欢迎。自动/动态存储更受欢迎,因为这是标准所要求的。堆栈/堆是基于实现的,理论上可以通过另一种方式实现。大多数实现都使用堆栈来支持具有自动存储的对象

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

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

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


我不是问堆栈/堆是什么意思,也不是问内存管理是如何工作的。我在问为什么术语自动/动态存储比术语堆栈/堆更受欢迎。

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

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

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

因此,自动/动态存储是标准用于分类(“抽象”)对象生命周期的术语。如果您想像标准描述的那样谈论对象,这些是合适的术语。

堆栈和堆是可以用来支持它们的(“具体的”)实现技术。除非您讨论的是特定的实现,否则使用这些术语就不太正确。

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

> P>堆栈和堆将与实现相关的概念引入图片,而“自动”和“动态”的术语更为一般:

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


术语“堆栈”和“堆”用于指标准库中的功能(
stack
make\u heap()
push\u heap()
,等等)它与存储持续时间几乎没有关系。

Automatic告诉我一些关于对象生存期的信息:特别是它会自动绑定到封闭作用域,并在该作用域退出时自动销毁

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

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


Heap又是一个重载名称,表示排序容器的类型或免费存储管理系统。这不是所有系统上唯一可用的免费存储,它也没有告诉我有关分配了
new

的对象的生命周期的任何具体信息。我认为下面的问题没有回答您的问题@但事实并非如此。或者至少它没有说明一个术语比另一个术语更受欢迎的方式,或者不同之处。我一直认为这可能是重复的,因为标准没有规定自动存储持续时间必须像堆栈一样实现。@LuchianGrigore:直到编辑,我一点也不清楚这个问题是关于术语而不是别的。从评论/答案来看,其他人也不清楚。很抱歉,我对你之前的答案投了反对票,我意识到这个问题模棱两可+1同样值得一提的是:并非所有系统都对非递归函数使用“堆栈”。另外:可以在“堆栈”上创建动态对象(我认为
boost::variant可以做到这一点)?实际上,在什么意义上是空闲存储空闲而堆栈内存不是空闲的?“空闲存储”只是指“可以分配的空闲(内存)资源的存储”。因此,任何特定于系统的内存分配方式,如
mmap
sbrk
,都是有价值的。除了作为可选的实现细节外,堆栈内存一方面是由特定于系统的分配器之一返回的普通内存(与SPARC不同或不存在堆栈内存时除外)-另一方面,处理(取消)该内存分配的方法。