欢迎来到天天文库
浏览记录
ID:30836039
大小:152.00 KB
页数:14页
时间:2019-01-04
《数据区_代码区_堆栈区_操作系统堆栈》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、堆和栈的区别一、预备知识一程序的内存分配一个由C/C++编译的程序占用的内存分为以下儿个部分1、栈区(stack)—rh编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS冋收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)。4、文字常量区一常量字符串就是放在这里的,程序结束后由系统释放5、程序代码区一存放函数体的二进制代码。二、例子程序这是一个前辈写的,非常详细i
2、nta=0;全局初始化区char*p1;全局未初始化区main(){intb;栈chars[]="abc";栈char*p2;栈char*p3=T23456”;123456 在常量区,p3在栈上。staticintc=0;全局(静态)初始化区p1=(char*)malloc(10);p2=(char*)malloc(20);分配得來得10和20字节的区域就在堆区。strcpy(p1,"123456");123456 放在常量区,编译器可能会将它与p3所指向的”123456"优化成一个地方。}二、堆和栈的理论知识在bbs±,堆
3、与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他笫一个开刀。首先,我们举一个例子:voidf(){int*p=newint[5];}这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存屮存放了一个指向一块堆内存的指针P。在程序会先确定在堆中分配内存的大小,然后调用operatornew分配内存,然后返凹这块内存的首地址,放入栈中,他在VC6卜■的汇编代码如下:00401028push14h
4、0040102Acalloperatornew(00401060)0040102Faddesp,400401032movdwordptr[ebp-8],eax00401035moveax,dwordptr[ebp-8]00401038movdwordptr[ebp-4],eax这里,我们为了简单并没有释放内存,那么该怎么去释放呢?是deletep么?澳,错了,应该是delete[]p,这是为了告诉编译器:我删除的是一个数组,VC6就会根据相应的Cookie信息去进行释放内存的工作。好了,我们回到我们的主题:堆和栈究竟有什么区别?
5、主要的区别由以下儿点:1、申请方式不同;2、管理方式不同;对于栈来讲,是由编译器白动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memoryleako3、分配方式不同;4、分配效率不同;5^空间大小不同:6、生长方向不同;対于堆來讲,生长方向是向上的,也就是向著内存地址增加的方向;对于栈來讲,它的牛长方向是向卜的,是向看内存地址减小的方向增长。7、存储内容不同;21申请方式stack:由系统口动分配。例如,声明在函数中一个局部变量intb;系统口动在栈中为b开辟空间。heap:需要程序员自己申请,并指明人小
6、,在c中malloc函数女IIp1=(char*)malloc(10);在C++中用new运算符如p2=newchar(5);但是注意p1、p2本身是在栈小的。2.2申请后系统的响应(分配方式)栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。栈有2种分配力式:静态分配和动态分配。静态分配是编译器完成的,比如局部变最的分配。动态分配llialloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。堆:堆都是动态分配的,没有静态分配的堆。首先应该知道操作
7、系统有一个记录空闲内存地址的链表,当系统收到程序的申请吋,会遍历该链表,寻找第一个空间大丁所中请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码屮的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的人小不一定正好等于屮请的人小,系统会自动的将多余的那部分重新放入空闲链表中。23申请大小的限制与牛长方向栈:在WindowsF,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最
8、人容量是系统预先规定好的,在WINDOWSF,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果屮请的空间超过栈的剩余空间时,将提示overflowo因此,能从栈获得的空间较小。(线程的堆栈空间默认为1M)堆:堆是向高地址扩展的数据结构,是不连
此文档下载收益归作者所有