我听到这些话被抛出很多但我不明白它们在c++中的含义。有人告诉我要在标准中查找,但在index中没有提到" stack"或"堆",只有堆栈展开,它不能说出堆栈是什么。
C ++中是否存在这些概念?
答案 0 :(得分:5)
我听到这些话被扔了很多......
是的,这些被广泛使用来自误解和坚持不恰当的术语,将硬件和操作系统概念与编程语言实现相结合。
C ++中是否存在这些概念?
只要您将"堆" 称为动态存储时长," stack&#34 ; 作为自动存储持续时间,c ++标准没有这些特定术语but uses the other ones的任何概念。所以没有。
请注意,局部变量,全局变量或参数的自动存储持续时间没有区别。
实际完成的内容如何被视为实现细节,实际上取决于目标CPU架构和操作系统环境。
完成答案(这就是为什么我说"只要你指的是......" ):
c ++标准库实际上提供了std::stack
和heap的概念
但这些都是指数据结构,与实现任何类型实例的内存分配无关。
答案 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块到抛出异常的路径上