C++;不';你不需要一堆吗? P>第一次老师把我介绍给C++,第一个定义是关于“基于堆栈的语言”,如java、C++和C++。

C++;不';你不需要一堆吗? P>第一次老师把我介绍给C++,第一个定义是关于“基于堆栈的语言”,如java、C++和C++。,c++,stack,standards,C++,Stack,Standards,现在我读到了,我真的很困惑 C++是一种基于堆栈的语言,但不需要堆栈?非“基于堆栈的语言”不仅仅是一种不需要堆栈的语言 Java的字节码语言是基于堆栈的语言,因为它的操作不在寄存器上操作,而是在堆栈上操作。另一方面,英特尔微处理器的ASM语言使用寄存器,这可能反映在为该体系结构编译的语言中 C和C++可能不是栈,也可以不是栈。这完全取决于编译器和目标OS/微处理器。你不能假设它是或不是。然而,在实践中,它主要是以基于寄存器的方式实现的 即使该语言完全使用寄存器运行,您仍然有一个不适合寄存器的函

现在我读到了,我真的很困惑

C++是一种基于堆栈的语言,但不需要堆栈?

非“基于堆栈的语言”不仅仅是一种不需要堆栈的语言

Java的字节码语言是基于堆栈的语言,因为它的操作不在寄存器上操作,而是在堆栈上操作。另一方面,英特尔微处理器的ASM语言使用寄存器,这可能反映在为该体系结构编译的语言中

C和C++可能不是栈,也可以不是栈。这完全取决于编译器和目标OS/微处理器。你不能假设它是或不是。然而,在实践中,它主要是以基于寄存器的方式实现的

即使该语言完全使用寄存器运行,您仍然有一个不适合寄存器的函数调用和局部变量堆栈。该堆栈的存在并不会使语言堆栈成为基于语言的堆栈,而是缺少寄存器

编辑:挑剔正如用户mikera所建议的:Java的字节码语言是基于堆栈的,但是为了在大多数基于寄存器的体系结构中运行它,您需要在基于寄存器的体系结构中翻译基于堆栈的字节码语言。这项工作可以由JVM中的解释器来完成,也可以由本机编译器的JIT或非JIT字节码来完成。

当我听到“基于堆栈的语言”时,我通常会想到像FORTH这样的语言,其中所有操作都是在堆栈上完成的,即没有变量。我猜当你的老师说Java时,他们指的是基于堆栈的JVM


现在,C++标准绝对没有堆栈或堆的概念,只有自动存储和动态存储之类的东西。C++是用更抽象的概念来指定的,它允许它在许多不同的实现和硬件上工作。当然,事实证明,这些思想直接映射到堆栈的思想上,因此每个实现最终都会使用一个堆栈。

C++(如C、Java和大多数其他块结构语言)需要一个“堆栈”,即某种后进先出的数据结构来保存函数调用的激活记录。也就是说,一个函数可以递归地调用它自己到某个任意深度,当它这样做时,每个调用的参数/局部变量必须独立于以前调用的参数/局部变量。当这些函数调用返回时,必须销毁每个函数的参数/局部变量

然而,这并不需要在直接支持硬件堆栈的CPU上执行。完全可以执行C++(以及其他块结构语言,如上面所提到的),而不需要对堆栈进行直接的硬件支持。 例如,早期的Cray和(甚至当前的)IBM大型机都不支持堆栈。尽管如此,他们仍然可以支持C++。至少在大多数情况下,用于激活记录的后进先出数据结构是动态分配的,并构建到一个链表中。调用每个函数时,其激活记录将被分配并添加到链接列表中。当函数返回时,激活记录将从列表中删除,并释放内存

这样,如果你从一个抽象的观点来看事物,把栈看作它提供的基本操作的本质,那么,是的,C++需要堆栈。如果你不太抽象地查看“栈”,并用CPU栈(或按顺序排序)来思考,那么,C++就不需要栈(C和java等登记)

它是语义。< /P> 想想汽车吧。汽车被描述为收音机、速度、电动座椅、CD播放机、杯托数量、油漆颜色等。功能列表中没有提到运行所有这些东西的动力来源。几乎所有的汽车都使用汽油来驱动内燃机,发动机转动车轮并运行发电机来产生电力来运行所有的附件。不需要发动机,但大多数汽车都有


语言规范讨论了数据的生命周期。它没有说明生命周期是如何实现的。事实证明,99%的C++编译器使用全局数据、堆栈和堆来满足语言规范所需的数据生命周期的要求。

NITPoice:java绝对使用寄存器。只是这种语言没有让你直接使用的工具。它仍然会(通过JIT)编译成使用寄存器的本机代码。@mikera:Nitpick。Java不使用寄存器。但是JVM实现(和JIT)可以作为应用程序运行的一部分。我认为Victor的意思是java字节码是围绕堆栈显式设计的(不考虑寄存器)。但这并不能阻止运行字节码的实现使用寄存器。@mikera:按照你的推理,那么一切都使用寄存器。这不是重点。字节码指令不使用寄存器。如果有一个JIT编译器将这些基于堆栈的指令从另一种语言转换成基于寄存器的指令是完全不同的事情。我仍然不明白这是什么意思,例如,
new
关键字,正如前面在这里的注释@user1797612:new allocates在heap中所讨论的那样。堆是一个不同的内存区域,用于不绑定到函数调用堆栈的动态分配。在C中,如果使用malloc,您将在堆中得到一些东西。在C++和java中,如果使用<代码>新< /COD>,将从堆中得到一些东西。C++不是基于堆栈的语言。这是你的误解。它可以使用堆栈(大多数实现都可以)。但这不是一个要求,而是你所使用的硬件的一个属性。@LokiAstari你能举个例子吗