我知道每个片段的用途,但我想知道是谁用c或c++这样的语言实现它们呢?
它们是由c/c++编译器程序员在编写语言实现时编写的吗?或者这些段是在OS /硬件级别实现的(可能是当OS为程序选择一个地址空间时)?
我把堆栈框架想象成一个简单的c++结构,它被推入堆栈中,用于每个函数调用。我把堆想象成一个动态数组等等.
发布于 2014-06-22 12:17:30
这是一个有点粗略的- HW架构,内存模型等都会影响C/C++实现可能具有“段”特性的方式。旧的CPU有局限性,导致了一组更复杂的“段”(iAPX 286 -还记得吗?)所以把这当作一个粗俗的介绍,谷歌的热门词,.
对象代码包含可执行语句产生的代码:由组装的机器指令产生的字节。这将进入代码段,这将(通常)导致一个受写保护的内存段。
对象代码包含数据:由组装的数据定义语句产生的字节,在某些初始化(或默认情况下为零,在C/C++情况下),这将进入数据段,不受访问限制。
CPU的工作方式需要一个堆栈:在堆栈上推送返回地址,并通过推送函数参数传递最有效的参数约定。“堆栈帧”部分是“按约定”,但通常由返回地址和参数组成;为局部变量保留额外的空间:为每个实例化保留一组(如果函数是递归的,这很重要)。
堆只是一个内存区域,分配(malloc,new)是从该区域提供的。它通常被分配到代码和数据段之外。堆栈可以从堆中取出--这里取决于您是只有一个堆栈段还是几个堆栈段(比如线程)。
此外,请注意,有几种对象代码“格式”或“语言”,即如何在对象代码中定义这些段。这取决于系统的加载程序能够处理什么:一种这样的格式称为"a.out",另一种是"ELF“。编译器必须遵守格式和可能性。
发布于 2014-06-22 12:18:08
它们是由c/c++编译器程序员在编写语言实现时编写的吗?或者这些段是在OS /硬件级别实现的(可能是当OS为程序选择一个地址空间时)?
段入口点主要在工具链的链接阶段(和链接器程序)进行管理。
从这个意义上说,是的,这些是由编译器开发人员实现的。
不过,您可以提供自己的链接器脚本,您可以在其中指定应该在哪些具体内存地址中发生这些段,以及这些内存地址是否指ROM或RAM。
我把堆栈框架想象成一个简单的c++结构,它被推入堆栈中,用于每个函数调用。我把堆想象成一个动态数组等等.
恐怕没有那么简单:
https://stackoverflow.com/questions/24350999
复制相似问题