加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 堆栈地址是否由堆地址共享?

发布时间:2020-12-16 10:27:42 所属栏目:百科 来源:网络整理
导读:我读到在大多数操作系统上,内存中的地址从最高到最低.所以我想知道堆,堆栈和全局内存是否都属于相同的排序..? 如果我创造了…… pointerType* pointer = new pointerType //creates memory address 0xffffff 然后在堆栈上创建了一个局部变量 localObject ob
我读到在大多数操作系统上,内存中的地址从最高到最低.所以我想知道堆,堆栈和全局内存是否都属于相同的排序..?

如果我创造了……

pointerType* pointer = new pointerType  //creates memory address 0xffffff

然后在堆栈上创建了一个局部变量

localObject object

将localObjects地址设为0xfffffe

或者堆和堆栈的排序完全不同.

解决方法

the addresses in memory starts from highest to lowest

您街道上房屋的地址是从最高到最低,还是从最低到最高?那么,这取决于你驾驶的方式.

就像邮政地址一样,内存地址根本就没有订购.每个地址只是识别内存中的唯一位置(至少在概念上.我们暂时忽略分段或虚拟内存).

但是,当您的邮件操作符发送每日邮件时,他很可能以最高到最低或最低到最高的顺序工作(可能两者都在街道的一侧,而在另一侧).当然,这比随意挨家挨户跳跃更有效.此外,它使承运人的工作更加简单.如果他以随机的顺序挨家挨户地跳,那么很难跟踪他已经访问过哪些房屋,以及哪些房屋仍然需要交付.如果他按顺序排列,那么他的卡车位置就是他需要跟踪的全部内容.

堆栈与此类似.它不占用内存中的任意位置,而是具有第一个位置,后续位置从那里按逻辑顺序跟随.以这种方式,堆栈指针(通常是“SP”)是跟踪哪些堆栈位置被占用以及哪些是空闲所需的全部.

但是,堆必然是不同的.虽然堆栈固有地具有先进先出的排序,但堆本质上是无序的.堆内存可以随时分配和释放.早期的分配可以比以后的分配更长.因此,堆必须能够分配任意地址范围,并且必须全部跟踪它们.

由于堆栈和堆运行的方式不同,它们应占用不同的内存区域.在您的示例中,第二个堆栈分配将覆盖堆分配占用的内存.显然,这将是一件坏事,并被称为stack overflow.

大多数现代CPU都具有保持堆栈内存和堆内存完全分离所需的所有功能.这是内存段和虚拟内存发挥作用的地方.在某些平台上,堆栈和堆可以由相同的地址范围标识,同时仍占用物理内存的不同区域甚至二级存储.讨论它是如何工作的,超出了本文的范围.

但是,大多数现代操作系统实际上并没有这样做.更常见的是,使用“平坦”地址空间,其中所有地址,无论是堆栈,堆,代码还是其他,都指向相同的地址空间.通过避免为每个地址处理段标识符的需要,这使应用程序开发人员更容易.

在扁平地址空间中,使用相同的分离堆栈和堆的方案,这种方案在没有内存分段或虚拟化的古老CPU中使用:堆栈从内存的“顶部”(更高的地址)向下增长,并且堆增长从内存底部开始(低位地址).两者之间的某一点可以被选为两者的极限,当一个到达该点时,发生错误情况 – 堆栈溢出或内存不足.

当然,这种描述是一个巨大的简化,但希望它提供了一个更好的基本理解.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读