在C ++中,"heap"和"stack"是什么意思?

22 浏览
0 Comments

在C ++中,"heap"和"stack"是什么意思?

我经常听到这些词,但我不明白它们在C++中的意思。有人告诉我在标准中查找,但在索引中没有提到“stack”或“heap”,只有关于栈展开的内容,但没有解释栈是什么。这些概念在C++中存在吗?

0
0 Comments

在C++中,堆和栈是两个重要的概念。堆是一种特殊的数据结构,也被称为优先队列。C++标准库提供了一些算法,可以在随机访问迭代器上执行基本操作。

而栈在C++标准中有两个独立的含义。首先,它是一种数据结构(实际上是一个适配器)。其次,在"栈展开"中提到了栈,但并没有独立定义,而是将整个过程描述为:

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

然而,我真的不认为这是提问者想要的答案。根据我的理解,提问者询问的是堆和栈与对象存在的内存空间相关的问题。

我回答了提问者的问题。如果这不是提问者想要的答案,他们可以重新表达问题。

"我回答了提问者的问题"这可能是一个愚蠢的行为,因为这里提出的许多问题都可以被挑剔地忽略某个特定层次的细节。以这种方式回答只会让未来研究这个问题的人感到困惑。

0
0 Comments

堆和栈在C ++中的含义是什么?

堆和栈在C ++中的含义是一个常见的问题。许多人在命名这些概念时存在一个抽象泄漏的问题,这个问题已经传播到了C ++世界。

有时,当C ++人员谈论“堆”和“栈”时,他们讨论的是硬件中的逻辑存储位置。这通常是一个过度简化的观点,在寄存器、优化和缓存的世界中是不准确的。但是在这个观点中有一定的合理性。

然而,大多数时候,他们只是使用了“自动存储期”和“动态存储期”的不准确的同义词,这是几十年来的误解和对抽象思维的无能或抵抗的结果。

C ++是一种抽象。它非常明确地定义了一个抽象机器,标准解决这个主题的方式是讨论对象的存储期。如果声明了一个局部变量,它具有“自动存储期”,这意味着当它超出作用域时将被销毁。它可能会进入您执行的计算机的“栈”中,也可能进入其他位置(如果计算机以其他方式工作),甚至可能在编译阶段被优化掉!但是人们仍然会坚持说这个变量“在堆栈上”,因为他们认为这样做更简单。我想这是他们的权利,但客观上是错误的。

类似地,当编写std::make_unique(args...)(或new T(args...))时,您正在创建一个具有“动态存储期”的对象,其生命周期超出了当前作用域,只有当std::unique_ptr死亡时(或使用delete时)才会被销毁。这些通常不会被优化掉,但无法知道物理目标平台是否使用“堆”数据结构来实现C ++所谓的“自由存储”。例如,如果在橙子上运行C ++实现,那似乎不太可能。

因此,总结一下,如果您使用“在堆栈上”和“在堆上”的术语,那么很多人会理解您,但也会受到一些人的嘲笑。C ++标准是其中一个明智的人,根本不使用这些术语。

我的回答主要反映了我从您那里学到的关于使用这些术语的内容。我希望我写得差不多对;-) ... @πάνταῥεῖ 你之前收到了我的赞,所以应该不会太糟糕 🙂

0
0 Comments

C++中的堆和栈是非常常见的词汇,但实际上这些词汇并不是C++标准中的概念。这种使用词汇的误解源于混淆硬件和操作系统概念与编程语言实现的做法。事实上,在C++标准中,并没有明确区分自动存储期(automatic storage duration)和动态存储期(dynamic storage duration),而具体的实现细节取决于目标CPU架构和操作系统环境。

C++标准库提供了一些与堆栈相关的数据结构,比如std::stack和heap。但这些数据结构与内存分配方式无关。实际上,有一些实现甚至在没有堆栈或堆的情况下实现了这些概念。总之,C++标准并没有提供堆和栈的具体定义。

所以,这些词汇的使用在C++中是不正确的。虽然有一些相关的概念和数据结构存在,但它们与内存分配方式并不直接相关。在C++中,应该使用自动存储期和动态存储期的概念来描述内存的管理方式。

0