栈与堆栈的区别

栈与堆栈的区别

栈和堆栈是一个概念。

队列先进先出,在队头做删除操作,在队尾做插入操作。

栈先进后出,在栈顶做插入和删除操作。

堆和它们不同,不存在是先进后出还是先进先出。

 

1.栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。在编程中,例如C/C++中,所有的局部变量都是从栈中分配内存空间,实际上也不是什么分配,只是从栈顶向上用就行,在退出函数的时候,只是修改栈指针就可以把栈中的内容销毁,所以速度最快。 

 

2.堆(Heap)是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程,C/C++分别用malloc/New请求分配Heap,用free/delete销毁内存。由于从操作系统管理的内存分配所以在分配和销毁时都要占用时间,所以用堆的效率低的多!但是堆的好处是可以做的很大,C/C++对分配的Heap是不初始化的。 

 

3.在Java中除了简单类型(int,char等)都是在堆中分配内存,这也是程序慢的一个主要原因。但是跟C/C++不同,Java中分配Heap内存是自动初始化的。在Java中所有的对象(包括int的wrapper  Integer)都是在堆中分配的,但是这个对象的引用却是在Stack中分配。也就是说在建立一个对象时从两个地方都分配内存,在Heap中分配的内存实际建立这个对象,而在Stack中分配的内存只是一个指向这个堆对象的指针(引用)而已。

 

4.

堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。{堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。}

 

5.栈是先进后出的,但是对于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不要遵循什么次序,只要你喜欢。

 

*************************************************************************************************

 

从变量存储方面来看堆和栈的区别:

 

*程序的局部变量存在于(栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中;

 

*这样说比较准确,所谓的栈其实是由寄存器ebp和esp指向的一片内存空间(ebp指向栈底,esp指向栈顶),原则上是由高地址向低地址生长的一片空间,会保存一些临时的数据,比如一个函数中的临时变量以及返回地址,数据的出入是先进后出,后进先出.

 

*全局变量实际上是存在一个(一般来说正常的编译器)可读可写的内存空间,这个空间是在你写程序编译好的空间地址(由编译器决定),是固定的.

 

*堆是由操作系统管理的一片空间,事先是没有在进程空间里分配的(比如你在没有分配堆的时候就访问堆空间会报一个内存访问错误),一般是由程序动态的分配出来,一旦分配了以后,一般需要程序去释放自己的堆空间.

 

*************************************************************************************************

 

*堆,用于保存new 和malloc这些自定义的内存变量;

*全局静态区用于保存全局变量和静态变量;

*字符常量区,用于保存字符串;

*代码区,用于保存程序的二进制代码;


http://blog.tianya.cn/post-4429401-98080905-1.shtml

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用和引用的内容,(Stack)和堆(Heap)是两个不同的概念。是操作系统在建立进程或线程时为其分配的存储区域,具有FIFO(先进先出)的特性,用于存储局部变量和函数调用的相关信息。而堆是应用程序在运行时向操作系统请求分配的内存空间,用于存储动态分配的数据。 根据引用和引用的内容,(Stack)和堆(Heap)的存储内容也是不同的。在中,函数调用时首先进的是下一条指令的地址,然后是参数和局部变量。在函数调用结束后,会依次出,恢复到函数调用之前的状态。而堆中的存储内容由程序员自行安排,一般用于存储动态分配的数据。堆中的具体内容是由程序员控制的,通常在堆的头部存放堆的大小。 根据引用的内容,堆和的使用示例可以更好地说明它们之间的区别。在这个示例中,全局初始化区和全局未初始化区用于存储全局变量,用于存储局部变量和函数参数,堆用于存储通过动态分配得到的内存空间。在这个示例中,p1和p2指向的内存空间是通过malloc函数在堆中分配得到的,而p3指向的字符串是存储在常量区的。 综上所述,和堆是两个不同的概念。是操作系统为进程或线程分配的存储区域,用于存储局部变量和函数调用的相关信息;而堆是应用程序在运行时向操作系统请求分配的内存空间,用于存储动态分配的数据。它们的存储内容和使用方式也是不同的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [堆、堆栈区别(总结)](https://blog.csdn.net/Britripe/article/details/117083092)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值