代码,静态,堆栈和堆段实现

时间:2014-06-22 11:57:01

标签: c++ c stack heap segment

我知道每个细分的目的,但我想知道实际用c或c ++等语言实现它们?

他们在编写语言实现时是由c / c ++编译器程序员编写的吗?或者这些段是在OS /硬件级别实现的(可能是OS选择程序的地址空间时)?

我认为堆栈帧是一个简单的c结构,它被推入堆栈以进行每个函数调用。我把堆想象成一个动态数组等等......

2 个答案:

答案 0 :(得分:1)

这有点粗略 - 硬件架构,内存模型等都会影响C / C ++实现的特征"细分"。较旧的CPU有限制,导致更复杂的"段" (iAPX 286 - 还记得吗?)所以请把它作为原始介绍,谷歌搜索热门话题,......

目标代码包含由可执行语句产生的代码:由组装的机器指令产生的字节。这将进入代码段,这将(通常)导致写保护的内存段。

目标代码包含数据:由汇编的数据定义语句产生的字节,带有一些初始化(或者在C / C ++的情况下默认为零),这将进入数据段,没有访问限制。

CPU工作方式需要堆栈:通过推送函数参数,在堆栈上推送返回地址,最有效的参数传递约定。 A"堆栈框架"部分地按照约定#34;但通常它由返回地址和参数组成;为局部变量保留了额外的空间:每个实例化一个集合(如果函数是递归的,这很重要。)

堆只是一个从中提供分配(malloc,new)的内存区域。它通常分配在代码和数据段之外。堆栈可能会从堆中取出 - 这取决于您是只有一个堆栈段还是几个(想想线程)。

另外,请注意,有几种目标代码"格式"或者"语言",即如何在目标代码中定义这些段的方式。这取决于系统的加载器可以处理的内容:一种这样的格式称为" a.out"另一种格式是" ELF"。编译器必须遵循格式和可能性。

答案 1 :(得分:1)

  

他们在编写语言实现时是由c / c ++编译器程序员编写的吗?或者这些段是在OS /硬件级别实现的(可能是OS选择程序的地址空间时)?

段入口点主要在工具链的链接阶段(和链接器程序)进行管理。

从这个意义上讲,是的,这些是由编译器开发人员实现的。

您可以提供自己的链接描述文件,您可以在其中指定应在哪些具体内存地址发生这些段,以及这些内存地址是否指向ROM或RAM。

  

我认为堆栈帧是一个简单的c结构,它被推入堆栈以进行每个函数调用。我把堆想象成一个动态数组等等......

它根本不是那么简单我害怕:

  • 堆栈框架通常还需要跟踪本地实例化的变量,堆栈在异常情况下展开所需的信息等。
  • 堆分配内存需要一些基本机制来跟踪分配的内存块及其实际大小。
  • 静态内存初始化和类初始化需要运行静态实例化的类的构造函数。