C++是否有无堆栈或无堆实现?

26 浏览
0 Comments

C++是否有无堆栈或无堆实现?

C++标准没有关于堆栈或堆的任何规定,它们是实现特定的。这是正确的。

尽管它们不是C++标准的一部分,但我们最终仍然会使用它们,以至于它们就像是语言本身的一部分,并且必须考虑它们是否会影响内存或性能。

因此,我的问题是是否存在不使用堆栈和堆的C++实现?

admin 更改状态以发布 2023年5月24日
0
0 Comments

C++标准并未提到任何关于栈或堆的内容。实际上,它确实提到了——只是用了不同的词汇,而且没有具体说明栈和堆的实现方式。在C++03中有三种变量类型: 1.具有静态存储期限(3.7.1)。这些变量在程序运行期间一直保持\"在范围内\"。 2.具有自动存储期限(3.7.2)。这些变量只在它们被声明的上下文中有效。一旦超出范围,变量将被销毁和释放。 3.具有动态存储期限(3.7.3)。这些变量使用new表达式创建,并使用delete销毁。对象本身没有范围,因为它们的生命周期不受它们new的上下文的限制。当然,指向这些对象的指针是有范围的。指针具有自动或(很少但通常是错误的)静态存储期限。 \"栈\"和\"堆\"实际上只是两种对象的位置。它们是平台相关的实现细节,用来实现语言要求。因此,从技术上讲,您是正确的。标准没有关于堆和栈的任何说明。但是它确实关于存储期限有很多描述,这需要在一个真实的平台上进行某种实现。在大多数现代PC类型硬件上,这被实现为堆和栈。不使用堆或栈就可以在平台上实现不同类型的存储期限吗?这是有可能的——我想这可能是。但无论该实现最终是什么样的,它可能具有至少一种类似于其中一种的特征。除了所有这些,还需要考虑的是,标准要求同时具有自动和动态存储期限。任何不符合这两个要求的语言实现都不会是C++。它可能很接近,但它实际上不是C++。

0
0 Comments

有些实现(比如IBM大型机)并不像大多数人想象的那样使用栈,简单的原因是硬件不支持。相反,当你调用一个函数时,一个激活记录(即本地变量、参数和返回地址的空间)被分配从(其版本的)堆中。这些激活记录被构建成一个链表。

从纯粹的抽象观点来看,这当然是一个栈——它支持后进先出的语义,就像任何其他栈。不过你确实需要很抽象地看待它,才能称其为栈。如果你向人们展示一个通过内存块链接在一起的图表,我认为可以安全地猜想,大多数程序员会将其描述为一个链表。如果你追问他们,我认为大多数人会评价其为“是的,你可以以栈的方式使用它,但它仍然是一个链表”。

0