打印

关于堆!

[复制链接]
1514|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
areshan|  楼主 | 2010-12-10 12:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
堆和栈是两个不同的数据区。栈,用户可以自己设定栈底,在用特定的指令从栈顶装入数据或从栈顶弹出数据。而堆呢??????C中跟堆功能最像的就是动态内存的分配,本质就是地址的管理。堆就是一段内存空间,可以“动态”的分配给局部变量,局部变量使用完后,再把地址给堆重新分配给其他的动态变量!!!!!!
不知道这样理解对不对?
那么关于堆的地址的管理,当然不是程序员来管理的,程序员也不用自己申请地址,这些都是编译器帮你完成的,编译器在编译完一个局部变量时,会给它一个地址,这个地址就在堆中,等局部变量使用完毕后,再把这个地址给下个局部变量,这样就完成了堆地址的管理。。。。。。。。
不知道上面的理解对不对,还希望各位能说说自己对堆和栈的理解!谢谢!!!!!!

相关帖子

沙发
areshan|  楼主 | 2010-12-10 17:03 | 只看该作者
关于堆,个人觉得是编译器管理的一个数据区。至于编译器怎么管理的,可能要了解编译器原理,要了解变量是怎么被分配内存空间的等等和编译器有关的知识!

使用特权

评论回复
板凳
原野之狼| | 2010-12-10 19:31 | 只看该作者
你的描述大部分都是错的 先到网上找点资料了解一下 呵呵

使用特权

评论回复
地板
ningling_21| | 2010-12-10 20:17 | 只看该作者
感觉都是高手玩的东西...

使用特权

评论回复
5
areshan|  楼主 | 2010-12-13 08:23 | 只看该作者
谢谢原野之狼,我回头找资料学习下。

使用特权

评论回复
6
areshan|  楼主 | 2010-12-13 10:11 | 只看该作者
看到21ic以前的帖子有点明白:https://bbs.21ic.com/icview-32548-1-1.html;谢谢db10和flanker,和ayb_ic,computer00,db10说局部变量放在栈里,让我想到我刚看的ARM汇编,ARM用R0,R1,R2,R3传递函数参数(详见ATPCS),参数大于4个入栈。被调用的函数也有变量(或局部变量)要用到R4-R10,此时,要把用的R4-R10入栈,以免被调函数返回时先前的状态被破坏。C语言是有一个一个的函数组成,程序的执行就是不停的执行一个一个的函数。而CPU(或单片机)它的资源是有限的,就R0-R15,CPSR,PC,等等这些寄存器可用。我们在用C的时候,觉得我们可以随意的定义C允许的任何大小任何类型的变量,而C是不能直接被执行的,必须把C的那些语句,变量转换成CPU内部可执行命令,可处理的数据。CPU内部获取保存数据的就那么有限的寄存器,所以任何变量都必须给内存的寄存器。局部变量都是函数的内部变量,随着函数的调用完毕而消失。如果一个函数内部的局部变量数要是一次大于15个(大于内存寄存器的个数)那怎么处理,分时复用??????
CPU内部的寄存器是可以分时复用,但是如果你在函数后面要用到前面的变量怎么吧,所以数据必须保存。在哪???入栈!充分利用RAM的空间。

使用特权

评论回复
7
areshan|  楼主 | 2010-12-13 10:14 | 只看该作者
堆是程序员自己创造的一片菜地,想种什么自己决定。
那怪51没有开辟堆(或不用)也没有任何的关系!

使用特权

评论回复
8
areshan|  楼主 | 2010-12-13 10:17 | 只看该作者
原来编译器的一切规则都在由C变成汇编里!!!!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

728

帖子

0

粉丝