C ++标准没有提及有关堆栈或堆东西,它们是实现特定的 ,这是真的。
即使他们不是C ++标准的一部分,我们最终使用它们无论如何,这么多,这就像他们是语言本身的一部分,必须要考虑到内存或性能的目的。
因此,我的问题是有C ++不使用栈和堆的实现?
C ++标准没有提及有关堆栈或堆东西,它们是实现特定的 ,这是真的。
即使他们不是C ++标准的一部分,我们最终使用它们无论如何,这么多,这就像他们是语言本身的一部分,必须要考虑到内存或性能的目的。
因此,我的问题是有C ++不使用栈和堆的实现?
别人已经给出关于堆很好的答案,所以我会单独离开。
一些实施方式(例如,在IBM大型机上)不使用堆栈,因为大多数人会想起来,原因很简单,该硬件不支持它。 取而代之的是,当你调用一个函数,一个活动记录(即,为当地人,参数和返回地址空间)从分配堆(自己的版本)。 这些活动记录中内置了一个链表。
从纯粹抽象的角度来看,这无疑是一个堆栈 - 它支持后进先出的语义,就像任何其他堆。 你必须看它很抽象到堆栈虽然调用它。 如果你表现的人联系在一起的内存块的图,我认为它是安全的猜测大多数程序员将之形容为一个链表。 如果你把他们推倒,我想大多数人会判断它像“是的,你可以在一个类栈的方式使用它,但它仍然是一个链表。”
C ++标准没有提及有关堆栈或堆东西
它实际上做 - 只是没有在那些话,并没有指定如何栈和堆实现。
在C ++ 03有三种类型的变量:
new
表达,并用被破坏delete
。 对象本身是scopeless,在某种意义上说,他们的一生没有绑定在他们的背景下new
编辑。 立即指针到这些对象是的,当然,内窥镜检查。 该指针是自动的或,很少(通常错误地)静态存储的持续时间。 “栈”和“堆”实际上只是其中后第二两种类型的对象居住。 它们是实现语言的要求与平台相关的实施细则。
因此,技术上你是对的。 该标准并没有说明堆与堆东西。 但它确实说了不少关于存储时间的不同口味需要一个真正的平台某种实现。 在大多数现代PC类硬件上,这被实现为堆和栈。 可以在不同类型的存储时长的平台上实现,而无需使用堆或堆? 一切皆有可能 - 我想,它可能。 但是,无论是执行结束了,它很可能具有相似,两者的至少一个特性。
除了这一切,还有的是由标准所要求的自动和动态存储时间的考虑。 任何语言实现不符合这两个要求不会C ++。 这可能是接近,但它不会真的是C ++。
对于小的编程环境,例如Arduino的平台这是基于一个8K爱特梅尔微处理器(现在它具有32K或更高),一个堆不实施并且存在由库中没有定义新的运算符。 所有对象是静态或在栈上创建。 你失去了标准库的优势,但获得能够使用面向对象的语言编程一个非常小的平台 - 例如,创建类代表配置为特定的输出模式或串行端口引脚,创建一个类的对象给它的针数,然后调用该对象的功能,而不必通过周围的针数到你的程序。
如果使用new
上一个Arduino,你的程序编译但不链接-编译器G ++针对AVR的指令集,所以是一个真正的C ++编译器。 如果您选择提供自己的实现,你可以这样做,但在提供这么小的足迹实现的成本是不值得的增益在大多数情况下。
这实质上echo'ing大先生的回答(+1 BTW)。 栈和堆是抽象的概念。
在new
和delete
运算符(和malloc
和free
功能)真的只是称为堆抽象的接口。 所以,当你问一个C ++实现是“heapless”,你真的要求的实施,不会允许你使用这些接口。 我不认为这有什么预防的实现总是从失败的这些接口。
调用函数和调用返回之后恢复所述当前执行(并且任选地检索返回值)到堆栈的抽象接口。 当你所要求的C ++实现是“无堆叠”,你所要求的C ++实现从执行这些操作禁止该程序。 我想不出符合标准的方式让编译器承担这一条件。 该语言规定的源代码被允许定义函数,并定义的代码来调用函数。
所以我的答案是什么的措辞:“无堆叠”不“ heapless”是的。
不能有一个堆叠更少和堆更少的实现,因为C ++定义的构建体,例如功能和新的运营商。 调用一个函数需要一个堆栈,和“新”荷兰国际集团了一个实例都需要一个堆。 如何将这些实现可以是平台之间的不同,但这个想法是一样的。 总会有需要为实例对象的存储区域和另一个存储区跟踪的执行点,并调用层次。
由于86(和x64),对这些东西(即ESP寄存器)便利的设施,编译器使用。 其他平台可能会有所不同,但最终的结果是逻辑上等同。
我敢说没有这样的C ++实现,而仅仅是因为堆和栈是非常有用的抽象的,基本上市场上所有的处理器都提供了一些硬件支持,使它们非常有效。
由于C ++的目标是效率,C ++编译器会使用它们。 此外,C ++程序通常不会在真空中进行操作。 他们必须融入平台的生态系统,它是由平台的定义应用程序二进制接口 。 该ABI - 对于同样的原因 - 定义堆栈和C ++实现必须服从到其他内存结构。
然而,让我们假设你的C ++程序针对的是一个简单,体积小,资源有限的嵌入式平台与异国情调的微控制器和不包括操作系统(您的应用程序将成为OS!),并没有线程或进程。
首先,该平台可以根本不提供动态内存。 您将需要在链接时定义的静态内存池的工作,并开发自己的内存分配管理器( new
)。 C ++允许它,在某些环境中,它确实使用。
此外,CPU也可以是这样的,堆抽象是没有多大用处的,并且因此不值得实施。 举例来说,像的SPARC CPU定义滑动寄存器窗口机制是-结合了大量的寄存器- (!如果你看它,堆栈已经在HW完成)利用堆栈不是有效的函数调用。
长话短说,所有的C ++实现使用堆栈,大部分使用堆,但原因是密切相关的平台性能。
是有,主要是微控制器像飞思卡尔和PIC
2.无堆栈处理器现在正在使用。
我们不看内核的方式组装程序员做。 我们很高兴与裸机程序员的车型,只要需要基本面都存在。 堆栈是不是其中之一:我们最近碰到的几个无堆叠核,有没有问题开发的C编译器为他们。
所述的eTPU是一个24位增强的时间处理单元,在汽车和通用航空发动机控制所使用的,和过程控制。 的eTPU可能是一个协处理器,但它有一个完整的指令集和一个完整的CPU内核,它是无堆叠。 这是一个中等体积的处理器:可能你会开车或坐飞机回家的C今晚礼貌上无堆栈处理器。
我们有基于C99和ISO / IEC 18037.我们运行该处理器的标准C测试套件的eTPU C编译器。
飞思卡尔的RS08是一个更传统的MCU是无堆叠。 在“减少”的HC08 / HCS08芯的过程中,飞思卡尔除去CPU堆栈。 我们咨询了RS08的架构,我们从来不觉得需要坚持硬件堆栈。
要提到另外一个协处理器,我们谘询,飞思卡尔XGATE有一个非常友好的ISA和编程模型,但它不具有堆栈。
再就是“几乎无堆叠”。 微芯片PIC从未有过的数据叠加,只一个8条目(或在增强14位内核16入口)调用返回堆栈。 没有人会怀疑C适用于照片。
这些部件,尤其是的eTPU,被设计为编译器的友好和鼓励机器生成的代码。
还有其他非基于堆栈的处理器,最近一些创造,跨越的应用范围和享受自己的C编译器。 有中到大批量无堆叠的部分。 性能通常是主要的原因,部分不具有堆栈。
http://www.bytecraft.com/Stack_controversy