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

这个问题在这里已经有了答案:

  • 什么和堆栈和堆在哪里? 25个答案

  • 我听到很多这样的话......

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

    这些概念是否存在于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

    上一篇: what do heap and stack mean in C++?

    下一篇: Return Instruction Pointer in the stack