C ++中的堆栈和堆栈意味着什么?
这个问题在这里已经有了答案:
我听到很多这样的话......
是的,这些广泛使用来自误解和坚持不适当的术语,混合硬件和操作系统的概念与编程语言实现。
这些概念是否存在于C ++中?
只要您将“堆”称为动态存储持续时间 ,将“堆栈”称为自动存储持续时间 ,c ++标准就没有任何关于这些特定术语的概念,而是使用其他术语。 所以不行。
请注意,局部变量,全局变量或参数的自动存储时间没有区别。
实际完成的方式如何被视为实现细节,实际上取决于目标CPU体系结构和操作系统环境。
为了完成答案(这就是为什么我说“只要你指的是......”):
c ++标准库实际上提供了std::stack
和heap的概念。
但是这些涉及到数据结构,并且与如何实现任何类型实例的内存分配无关。
这些概念存在,是的。 问题在于,在命名这些概念时,全世界有数以亿计的人在他们的大脑中发生抽象泄漏,并且这已经蔓延到C ++世界。
有时,当C ++人员谈论“堆栈”和“堆”时,他们正在讨论硬件中的逻辑内存存储位置。 在寄存器,优化和缓存的世界中,这通常是过度简化的过程。 但是那里有逻辑基础。
然而,大多数情况下,他们仅仅使用不准确的同义词来表示“自动存储时间”和“动态存储时间”,由于几十年的误解以及对抽象思维的无法思考或抵触而延续下去。
C ++是一个抽象。 它非常有意地定义了一个抽象机器,标准甚至接近这个主题的唯一方法是讨论对象的存储时间。 如果你声明一个局部变量,它会自动存储持续时间,这意味着当它超出范围时它会被销毁。 它可能会进入执行计算机上的“堆栈”,或者其他位置,如果计算机以其他方式工作,或者甚至可能不会退出编译阶段! 但是人们仍然会坚持说这个变量是“在栈上”,因为他们认为这样做比较简单。 我想这是他们的权利,但他们仍然客观上是错误的。
同样,在编写std::make_unique<T>(args...)
(或new T(args...)
)时,您正在创建一个动态存储持续时间的对象,其持续时间会转义直接作用域,并且只会在std::unique_ptr
死亡(或者当你使用delete
)。 这些通常不会被优化,但是没有办法知道物理目标平台是否会使用“堆”数据结构来实现C ++所谓的免费商店。 例如,如果你的C ++实现运行在橙色上,那么它似乎不太可能。
所以,总而言之,如果你使用“在堆栈”和“在堆上”的术语,那么你会被许多人所理解,但被某些人嘲笑。 C ++标准是其中少数几个,并且完全不使用这些术语。
堆的概念当然存在于C ++中。 它是一种特殊的数据结构,也称为优先级队列。 C ++标准库提供了一定数量的算法,它们对随机访问迭代器进行操作以对其执行基本操作。
Stack在C ++标准中有两个独立的含义。 首先,它是一个数据结构(实际上是一个适配器)。 其次,它在stack unwiding
被提及,但没有被独立定义 - 相反,整个过程被描述为
调用自动对象的析构函数的过程,该自动对象构造在从try块到抛出异常的路径上
链接地址: http://www.djcxy.com/p/2273.html