请教个牛角尖的问题(堆和栈)

joziez 2004-12-23 10:09:01
我开始编程也有两年的样子了,但是对于堆和栈我一直分不大清楚,一般都是一起说的,但是也有分开说的,我不知道这两者之间在存储数据上的区别,还请知道的前辈不吝赐教,多谢!
ps:我会尽快把分数给了的。
...全文
68 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
joziez 2004-12-23
  • 打赏
  • 举报
回复
差不多知道了,都是分配内存的,一个分的大些,有一些专用的函数管理,一个分的小些也简单些...
jsblcg 2004-12-23
  • 打赏
  • 举报
回复
堆和栈都是内存,但管理方式不一样。
堆栈是CPU实现的,SS:SP(或ESP)所指就是堆栈,CPU在CALL及RET指令中使用堆栈存储地址
其他代码也可通过操作ESP使用堆栈(例如局部变量)。
堆栈有两个特征:1 堆栈操作是后进先出,堆栈一般是从高地址向低地址'增长'
2 高度动态,它对应的内存是内容变化最快的区域
一般用户无需管理堆栈,编译器自动生成堆栈管理代码,如想插手堆栈管理,必须明白汇编以及编译器、操作系统和CPU的约定,否则很容易崩溃。
堆是一块块组织的内存,也就是有组织的内存快。任何人都可把自己的管理的内存叫堆。但最常见有
操作系统的堆和运行库的堆。
操作系统如Winodws提供一组内存接口,如HeapAlloc之类,实现内存块操作,其对应的内存称为堆。
C/C++语言的运行库在操作系统提供的内存接口之上实现了自己的内存管理(主要是针对小块内存操作例如new object操作进行优化,同时降低操作系统负载),提供malloc/new之类的接口,叫运行库的堆。
更详细的细节还是看CPU编程模型和操作系统接口的反汇编代码吧!
iceuct 2004-12-23
  • 打赏
  • 举报
回复
它的格式变了,把解释分成四块与图形对应。
————————————————————————————-
怒对此脚本编写者
iceuct 2004-12-23
  • 打赏
  • 举报
回复
new和MALLOC用的是堆,PUSH 和POP 用的是栈,它们的确不同
###################################################
堆是|——————||————————||————|————|
8BYTE 你申请的空间 8BYTE 8BYTE
管理结构 指向下一 |两个双链表
空闲堆的|指针
管理结构|
####################################################
栈是由SP指向的空间。PUSH时:SP-4,(WIN32)MOV [SP],参数
#######################################################
CALL时:等价PUSH (下一个指令的)IP
JMP 地址
syncsync 2004-12-23
  • 打赏
  • 举报
回复
call 是call代码阿,怎么是调用栈了?
joziez 2004-12-23
  • 打赏
  • 举报
回复
call调用的那种是栈么?还是……
wangziz 2004-12-23
  • 打赏
  • 举报
回复
有很多操作系统,当进程启动时,进程的整个堆空间为一大块,当进程需要从堆中分配内存空间时,OS按照它自己的策略将整个堆切分成适当的大小的空间,给进程使用。进程释放内存时,OS将释放的内存空间重新放回堆。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧