c++ - 谁负责C++中的栈和堆?

标签 c++ c compiler-construction heap-memory stack-memory

这不是他们的目的是什么的问题。相反,问题是谁或什么负责发明堆栈和堆?

这些是C++编译器的发明吗?

操作系统是否指定了 RAM 中指定的“堆栈”和“堆”的内存部分?

我很确定它们没有内置到硬件中,但我可能是错的。

此外,编译器是否负责生成汇编代码以指定哪些本地或函数数据将存储在堆栈而不是 CPU 寄存器中?

最佳答案

Who or what is responsible for the invention of the stack and heap?

至于发明栈和堆,你最好在网上搜索一下。这些概念已经存在了几十年。

Are these inventions of the C++ compiler?

也许发明在这里是错误的术语。它们是数据结构。编译器和操作系统(如果存在)负责组织和利用内存。

Does the os specify memory sections in RAM designated "stack" and "heap"?

这是特定于操作系统的,可能因操作系统而异。有些操作系统保留堆栈和堆区域,有些则不保留。

在我正在研究的嵌入式系统中,有两个堆区域:1) 链接器中指定的区域,2) 分配给操作系统的一部分内存。这两个区域都设置为零大小,因此我们没有任何堆。

堆栈区域由在 C 语言运行时库初始化之前运行的初始化代码设置。 RTL 代码也可以创建一些堆栈区域。我们的 RTOS 还创建堆栈区域(每个任务一个)。

所以,没有一个区域叫做堆栈。一些平台根本不使用堆栈概念(尤其是那些内存容量受到严格限制的平台)。

I'm pretty sure they are not built into the hardware but I could be wrong.

取决于硬件。简单廉价的硬件只分配一 block RAM(读/写内存)。更复杂和昂贵的硬件可能会为堆栈、堆、可执行文件和数据分配单独的区域。常量可以放在 ROM(只读存储器,例如 Flash)中。没有支持一切的单一尺寸或单一配置。与小型嵌入式系统相比,台式计算机动物是不同的。

Also, is the compiler responsible for generating assembly code that specify which local or function data will be stored on the stack vs CPU registers?

任务可以在链接器或编译器或两者中。
许多编译器工具链同时使用堆栈和 CPU 寄存器。许多变量和数据可以在堆栈、寄存器、RAM 或 ROM 中。编译器旨在充分利用平台资源,包括内存和寄存器。

一个很好的学习示例是编译器生成的汇编语言。还要查看链接器指令文件。寄存器或堆栈内存的使用非常依赖于数据结构(和类型),因此对于不同的功能可能有所不同。另一个因素是可用的内存量和种类。如果处理器可用的寄存器很少,编译器可能会使用堆栈传递变量。较大的数据(不适合寄存器)可以在堆栈上传递或传递给数据的指针。可用的选项和组合太多,无法在此一一列举。

总结

为了使 C 和 C++ 语言具有很好的可移植性,许多概念都委托(delegate)给了实现(编译器/工具链)。其中两个概念通常称为堆栈。 C 和 C++ 语言标准使用一个简单的模型作为语言的环境。此外,还有“托管”和“半托管”等术语表示平台支持语言要求的程度。 堆栈 是平台为了支持语言而不需要 的数据结构。它们确实有助于提高实现效率。

如果支持堆栈和堆,则它们的位置和管理是实现(工具链)的责任。编译器可以自由使用它自己的内存管理功能或操作系统(如果存在)。堆栈和堆的管理可能需要硬件支持(例如虚拟内存管理或分页;以及栅栏)。堆栈不需要向堆增长。不需要堆栈向正方向增长。这些都取决于实现(工具链),他们可以随心所欲地实现和定位堆栈。 注意:它们很可能不会将变量放在只读内存中,也不会定位超出内存容量的堆栈。

关于c++ - 谁负责C++中的栈和堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34551747/

相关文章:

c++ - 将基本数据类型封装到类中

C++ - 根据赋值侧重载 [] 运算符

C++ STL - 遍历序列中的所有内容

C++ SQL 数据库库比较

c++ - 我可以更改 SAXPY 函数的公式吗?

c - 在C中,从main调用函数

c - 使用线程进行银行账户转账

c - 是否可以创建像 DrawFocusRect() 这样的 XOR 笔?

c++ - 我什么时候可以自信地使用 -O3 编译程序?

c# - 为什么 C# 编译器允许空枚举?