首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >代码、静态、堆栈和堆段实现

代码、静态、堆栈和堆段实现
EN

Stack Overflow用户
提问于 2014-06-22 11:57:01
回答 2查看 579关注 0票数 0

我知道每个片段的用途,但我想知道是谁用c或c++这样的语言实现它们呢?

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

我把堆栈框架想象成一个简单的c++结构,它被推入堆栈中,用于每个函数调用。我把堆想象成一个动态数组等等.

EN

回答 2

Stack Overflow用户

发布于 2014-06-22 12:17:30

这是一个有点粗略的- HW架构,内存模型等都会影响C/C++实现可能具有“段”特性的方式。旧的CPU有局限性,导致了一组更复杂的“段”(iAPX 286 -还记得吗?)所以把这当作一个粗俗的介绍,谷歌的热门词,.

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

对象代码包含数据:由组装的数据定义语句产生的字节,在某些初始化(或默认情况下为零,在C/C++情况下),这将进入数据段,不受访问限制。

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

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

此外,请注意,有几种对象代码“格式”或“语言”,即如何在对象代码中定义这些段。这取决于系统的加载程序能够处理什么:一种这样的格式称为"a.out",另一种是"ELF“。编译器必须遵守格式和可能性。

票数 1
EN

Stack Overflow用户

发布于 2014-06-22 12:18:08

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

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

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

不过,您可以提供自己的链接器脚本,您可以在其中指定应该在哪些具体内存地址中发生这些段,以及这些内存地址是否指ROM或RAM。

我把堆栈框架想象成一个简单的c++结构,它被推入堆栈中,用于每个函数调用。我把堆想象成一个动态数组等等.

恐怕没有那么简单:

  • 堆栈框架通常还需要跟踪本地实例化变量、堆栈异常展开所需的信息等。
  • 堆分配的内存需要一些基本机制来跟踪分配的内存块及其实际大小。
  • 静态内存初始化和类初始化需要运行静态实例类的构造函数。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24350999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档