gpt4 book ai didi

c++ - 内存段

转载 作者:太空狗 更新时间:2023-10-29 23:32:40 24 4
gpt4 key购买 nike

我目前正在学习 C++ 中的动态内存,在尝试完全理解和理解程序内存中的内存段时发现了很多麻烦。

所以我们有 4 个内存段:堆栈、堆、数据和代码。

首先我想看看我是否掌握了它的基础

- 堆栈: 像堆栈一样管理的内存段一旦进入一个范围,您就会在该范围内为该范围分配有限的内存,其中应包含有关该范围的信息(变量等)

- 堆: 一个无限的动态内存段,当您在该段中分配内存时,它不会在您退出所使用的代码或函数的范围时被删除,它需要被你或 gc 删除(如果它不再可用)

- 代码:一段内存,包含需要CPU执行的代码

- 数据:包含变量信息的内存段(int x - x 表示内存单元 0x0FA20F)

我的第一个问题是,我做对了吗?我真的不确定....

如果我没有做对,我的问题是:

  • 每个内存段的用途是什么?

  • 关于变量的内存段信息,例如,int x - x 表示内存单元 0x0FA20F 位于?

  • 使用递归时,当您从函数并且仍然有代码要在该函数中执行,即代码保存在人们所说的堆栈中,它指的是什么?,常规堆栈段?如果是这样,那是否意味着在堆栈中需要在当前范围内执行的常规代码行是否已存储?那么代码内存段是做什么用的呢?

如果有人能整理一下我现在脑海中的困惑情况,并在提到我的问题时向我解释每个内存片段的全部作用,我会很高兴。

最佳答案

你很接近,但还不够。您指的是一个非常古老的模型,类似于实模式 x86 内存。但是,让我们运行它并尝试消除一些混淆......

首先,C++(按照标准规定)在谈论内存模型时不会提及诸如堆栈 之类的术语。这些是实现的细节。接下来,我们假设您正在谈论典型的 x86(32 位或 64 位)PC 实现。

C++ 本身定义了以下 storage durations :

  • static:程序开始时分配,程序结束时释放。具有此存储持续时间的变量大致对应于 x86 系统上data 段中的存储。
  • automatic:在封闭代码块的开头分配,并在封闭 block 的末尾释放。这些是本地变量,将在 x86 系统中的堆栈上分配。
  • dynamic:通过new分配,通过delete释放。变量一直存在直到被删除,并且会在您的实现中分配到
  • 局部线程:线程开始时分配,线程结束时释放。

还有一个 bss 段,用于零初始化变量。

每个函数调用都有自己的堆栈帧,其中包括所有具有自动存储持续时间的变量,以及函数的参数、返回值的空间和调用函数状态的存储拷贝。当函数返回时,此状态将恢复,以便您可以从中断处继续。此状态的一部分是指令指针,它是指向下一条要执行的指令的指针。指令序列本身总是在代码段;它不会被复制到堆栈中。

这是一种简化,对于大多数用途,您不需要知道存储持续时间标准定义之外的任何信息;剩下的就是实现细节了!

[注意:现代用法倾向于从内存访问权限的角度来思考。代码将加载到只读可执行的内存页中,而数据(包括堆栈)将在读写页中理想情况下标记为不可执行。任何进一步的区分都有些毫无意义,除了堆栈/堆。]

关于c++ - 内存段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32922829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com