堆和堆栈在C ++中意味着什么?

时间:2016-05-20 15:54:45

标签: c++ language-lawyer

我听到这些话被抛出很多但我不明白它们在中的含义。有人告诉我要在标准中查找,但在index中没有提到" stack"或"堆",只有堆栈展开,它不能说出堆栈是什么。

C ++中是否存在这些概念?

3 个答案:

答案 0 :(得分:5)

  

我听到这些话被扔了很多......

是的,这些被广泛使用来自误解和坚持不恰当的术语,将硬件和操作系统概念与编程语言实现相结合。

  

C ++中是否存在这些概念?

只要您将"堆" 称为动态存储时长" stack&#34 ; 作为自动存储持续时间,c ++标准没有这些特定术语but uses the other ones的任何概念。所以没有。

请注意,局部变量,全局变量或参数的自动存储持续时间没有区别。

实际完成的内容如何被视为实现细节,实际上取决于目标CPU架构和操作系统环境。

完成答案(这就是为什么我说"只要你指的是......" ):

c ++标准库实际上提供了std::stackheap的概念 但这些都是指数据结构,与实现任何类型实例的内存分配无关。

答案 1 :(得分:3)

概念存在,是的。问题在于,在命名这些概念时,全世界有数亿人的大脑中存在抽象泄漏,这已经蔓延到C ++世界。

有时,当C ++人员谈论“堆栈”和“堆”时,他们正在讨论硬件中的逻辑内存存储位置。在寄存器,优化和缓存领域,这通常是一种过度简化的过度简化。但那里有逻辑基础。

但大多数情况下,他们只是在“自动存储持续时间”和“动态存储持续时间”中使用不准确的同义词,这是由于数十年的误解以及对抽象方面的思维无能或抵制所致。

C ++是一种抽象。它非常刻意地定义了一个抽象机器,标准甚至接近这个主题的唯一方法是讨论对象的存储持续时间。如果声明一个局部变量,它有自动存储持续时间,这意味着当它超出范围时它将被销毁。它可能会进入你执行的计算机上的“堆栈”or someplace else if the computer works some other way,或者它甚至可能无法逃脱编译阶段!但是人们仍然会坚持说这个变量是“在堆栈上”,因为他们认为这样做在某种程度上更简单。我认为这是他们的权利,但他们仍然是客观错误的。

同样,在编写std::make_unique<T>(args...)(或new T(args...))时,您正在创建一个动态存储持续时间的对象,其生命周期会逃避直接范围,并且只会在std::unique_ptr死亡(或使用delete时)。这些通常不会被优化,但是无法知道物理目标平台是否将使用“堆”数据结构来实现C ++调用免费存储的内容。例如,如果你有一个运行在橙色上的C ++实现,那么它似乎不太可能。

所以,总而言之,如果你使用“在堆栈上”和“在堆上”的术语,那么你会被许多人理解,但有些人会嘲笑。 C ++标准是少数几个合理的标准之一,根本不使用这些术语。

答案 2 :(得分:0)

堆的概念肯定存在于C ++中。它是一种特殊的数据结构,也称为优先级队列。 C ++标准库提供了一定数量的算法,这些算法在随机访问迭代器上运行,以对其执行基本操作。

Stack在C ++标准中有两个独立的含义。首先,它是一个数据结构(实际上是一个适配器)。其次,它在stack unwiding中提到,但没有独立定义 - 相反,整个过程被描述为

  

为构造的自动对象调用析构函数的过程   在从try块到抛出异常的路径上