java - 堆栈由编译器或操作系统/架构创建

标签 java c compiler-construction operating-system

这个问题是我上一个问题的跟进

stack growth direction

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

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

最佳答案

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

操作系统不知道您的程序主要使用堆栈还是堆。然而,由于大多数编程语言以某种方式使用堆栈,它知道它应该分配一个。例如,Java 将其对象存储在堆上,但 JVM 的大多数实现将使用堆栈来维护调用框架(和原始局部变量),因此它也需要堆栈。

关于java - 堆栈由编译器或操作系统/架构创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3606188/

相关文章:

c - CPU/编程语言使用哪种幂运算算法?

java - 调用 java 是创建新的 JVM 实例还是另一个 Java 进程?

java - 创建部分覆盖父级的 Activity 的最佳方法

c - 执行 Lex 和 Yacc 的顺序?

c - R包: Call C Function Within Rcpp

将文件指针传递给方法时出现 C 段错误

java - Apache HttpClient - 记录请求中协商的 TLS 版本?

java - 如何在ELKI中不从文件源创建数据库?

C:太大的堆栈会导致段错误吗?

javascript - F# 到 JavaScript 编译器的 F# 项目模板