堆栈由编译器或OS /体系结构创建

bre*_*ett 4 c java compiler-construction operating-system

这个问题是我上一个问题的后续问题

堆栈增长方向

我想知道堆栈是由编译器还是OS /架构创建的?OS如何知道这些编译器特定的东西?例如:C++允许变量在堆栈和堆上创建数据,而java只允许堆.

此外,如果在堆上创建堆栈,如帖子中所述,系统如何知道它,因为系统只知道堆栈指针和基指针.

zne*_*eak 6

堆栈是OS为您的程序分配的内存位置.一旦分配,操作系统就会将一个寄存器(在x86上,它是esp)设置到堆栈所在的位置,然后启动程序.编译器知道如果他们使用此寄存器中的值作为堆栈指针,它们就可以了.然后他们做任何他们想做的事情.操作系统只分配一个区域.它并不关心它之后是如何使用的.

操作系统不知道您的程序是否主要使用堆栈或堆.但是,由于大多数编程语言都以某种方式使用堆栈,因此它知道它应该分配一个.例如,Java的存储对象的堆上,但是JVM的大部分实施将使用堆栈来保持通话帧(和原始局部变量),所以它需要的堆栈了.