游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: hWnd

请问有谁知道堆和栈的区别???

[复制链接]

37

主题

378

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
 楼主| 发表于 2003-12-18 19:41:00 | 显示全部楼层

Re:请问有谁知道堆和栈的区别???

堆是heap,栈是stack,堆栈指的就是栈stack

37

主题

378

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
 楼主| 发表于 2003-12-18 19:53:00 | 显示全部楼层

Re:请问有谁知道堆和栈的区别???

最终,我找到一个神秘的角落,终于,我终于知道原  因  了!!!
        push        320                                        ; 00000140H
        call        ??2@YAPAXI@Z                                ; operator new//这个就是分配堆内存的系统函数
        add        esp, 4
        mov        edx, eax
        mov        ecx, 1
        ......
        push        eax
        call        ??3@YAXPAX@Z                                ; operator delete//这个就是释放堆内存的系统函数
        add        esp, 4
但是关于这个函数的原型(不知道原型是不是这个东西),及怎么调用还是要请教各位大侠!!!!

0

主题

38

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2003-12-18 20:19:00 | 显示全部楼层

Re:请问有谁知道堆和栈的区别???

堆在windows核心编程里有详细的解释。
实现是以Heap打头的一系列函数。
GetProcessHeap
HeapCreate
等等。

0

主题

38

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2003-12-18 20:21:00 | 显示全部楼层

Re:请问有谁知道堆和栈的区别???

不过,我个人更喜欢用虚拟内存管理函数。
以Virtual打头的一系列函数。

0

主题

38

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2003-12-18 20:25:00 | 显示全部楼层

Re:请问有谁知道堆和栈的区别???

在window下,malloc、new和heap最终好像都要调用virtual。
请问专家是不是?

0

主题

38

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2003-12-18 21:00:00 | 显示全部楼层

Re:请问有谁知道堆和栈的区别???

不对啊,堆栈(stack)是数据结构里的概念,先进后出。
函数的参数传递是通过堆栈实现的,
函数的局部变量难道也是按照先进后出管理的?不明白了。
哪位高手能不能帮忙指点一下。

6

主题

74

帖子

100

积分

注册会员

Rank: 2

积分
100
发表于 2003-12-19 13:51:00 | 显示全部楼层

Re:请问有谁知道堆和栈的区别???

在x86 cpu中  有个 esp (sp) 寄存器,就叫堆栈指针寄存器。
它所指向的内存区域就是栈。在进行函数调用时,编译器会
在函数头插入一段调整esp的指令。通常是sub esp xx;
在原来esp 和现在esp所指之间的内存就是保存局部变量的地方。
在函数末尾又会通过 add esp xx;将 esp 调回。此时即可认为局部
变量无效了。因为刚才放置局部变量的内存可能被做别的用处了。
比如连续调用两个函数,在调用第二个函数的时候,它的局部变量
所使用的内存和第一个所使用的是重叠的。

0

主题

38

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2003-12-20 15:14:00 | 显示全部楼层

Re:请问有谁知道堆和栈的区别???

明白了,多谢。

0

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
发表于 2003-12-24 21:05:00 | 显示全部楼层

Re:请问有谁知道堆和栈的区别???

局部变量放在栈顶的低地址端。
如图:

                  Local var 2
                           Local var 1
                 ESP-> Ret Addr
                           Param 1
                           Param 2

我们通常用的编译器生成的代码都是在PROLOG CODE中将ESP->EBP,然后使用BP/EBP寄存器间址访问堆栈数据,比如EBP[4]访问传入的参数,EBP[-4]则访问局部变量。函数返回前的EPILOG CODE则恢复现场。

请指正!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-5-14 21:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表