栈与堆的超基础知识

来源:互联网 发布:高台家的成员们网络剧 编辑:程序博客网 时间:2024/06/06 07:31
1.栈区存放函数的参数值,局部变量,由编译器自动分配内存空间并且在程序运行结束之后自动释放内存,占用的内存是一块块的  ,
  整体性很强,但一般较小,不易存储大文件,不易产生碎片。
2.堆区的大小一般由程序员决定,并且向系统申请,在 程序运行结束之后,程序员必须释放内存出来,不然可能造成内存泄漏。


3.寄存器区:用保存指针的地区(待补充),处于内存阶层的最顶端,系统获得操作资料的最快速途径。




4.全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,该区域共分为两块,初始化
的全局变量与静态变量放在一起,未初始化的全局变量与静态变量存放在一起。




5.文字常量区:常量字符串就是放在这里的,程序结束后由系统释放(字符串常量是一对双引号括起来的字符序列。)




6.程序代码区:存放函数体的二进制代码。


7.函数参数和局部变量存放在栈中,当函数运行结束并且返回时,所有的局部变量


  和参数都会被系统自动清除掉,目的是释放掉被他们所占用的内存空间。(栈中数据寿命短)


8.全局变量存储于静态区,而且永远不会被释放,但是全局变量被所有的类成员和函数所共享,
   所以全局变量的值很容易被修改,使用起来颇多隐患。(全局区全局变量数据不安全)(使用堆可以解决7,8条)




9.关于栈与堆的内存申请方式:


栈里面的内存申请,栈内数据所需要占用的内存是系统自己分配的,但是需要程序员提前替数据做出声明,例如(int a),然后
系统会自动在栈内为变量a开劈出一段内存给变量a;
堆里面的内存申请:程序员需要用new等语句向堆申请内存空间,并且用delte释放内存空间。


10.系统响应的不同
栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将会提示overflow,即栈溢出。
堆:系统收到程序中申请空间的要求后,会遍历一遍操作系统中,用于记录内存空闲地址的链表,
   当找到一个空间大于所申请空间的堆结点后,就会将该结点从空闲地址链表列表中删除,并将
该结点的内存分配给程序,然后在这块内存区域的首地址处记录分配的大小,这样我们在
使用deleted来释放内存的时候,delete才能正确的识别并删除该内存区域的所有变量。
(我们申请的内存空间与堆结点上的内存空间不一定相等,这时系统会自动将堆结点上

多出来的那一部分内存空间回收到空闲链表中。)


1.栈与堆空间大小的不同
  栈是一块连续的内存区域,它的大小是2m或1m(栈的大小是由编译器来管理的,一般是1m或2m,也可以
   自己手动设置,其具体的大小可能根据编译器的不同而异,但我们可以不用指望栈能存储比较大的数据)
  堆内存是向系统申请当的内存,由程序员管理的,new或者malloc时系统正常情况下会给你一块堆内存空
  间(该内存空间由链表将各个不连续的内存区域连接起来,这些串联起来的内存空间叫做堆),堆想什么时候存数据,想什么时候释放(delete,free)都可以,堆的大小没有什么具体数值
  。看机器的运行状况,配置状况而定。它的上限由系统中有效的虚拟内存来定,因此获得的空间比较大
   而且获得空间的方式也比较灵活。


2.栈与堆执行效率的不同
  栈由系统自动分配,因此速度比较快,但是程序员不能对其进行操作。
  堆由程序员分配内存,一般速度比较慢,而且容易产生内存碎片,不过用起来很方便。


3.执行函数时的不同
栈:函数调用时,第一个进栈的是被调用函数下一行的内存地址,其次是函数的参数,假如参数多于一个,次序是从右到左,
    最后是函数的局部变量。
   由于栈的先进后出原则,函数结束时正好与其相反,首先是局部变量先出栈,然后是参数,次序是从
   左到右,这时所有的变量都已出栈,指针自然地知道第一个进栈的那行内存地址,也是被调用函数的
   下一行内存地址,程序根据该地址跳转到·被调用函数的下一行自动进行。
堆:堆是由一大堆不连续的内存区域,在系统中由链表将它们串接起来,因此在使用的时候必须
    由程序员来安排。它的机制很复杂,有时为了分配一块合适的内存,程序员需要按照一定的
    算法在堆内存中搜索可用的足够大小的空间,如果没有满足条件的空间,那么就要向系统发出
    申请增加一部分内存空间。(可以存储大的数据,灵活性强,但是运行效率较低,极易产生内存碎片,)




//一般而言,小的数据一般都是用栈来存储的。


4:为了数据隐秘起见,堆中的每个每个内存单元都是匿名的,必须先在堆中申请一个内存单元的
  地址,然后将该地址保存在指针中,这样就可以使用指针来访问该内存单元的数据(用特定的指针来存储函数地址,一来
   可以保证数据安全,不会被乱修改,二是可以提高效率)


5:栈的内存单元中的数据不是匿名的,程序员可以为他们命名,因此运行效率高。




每日一句英语:Give every day the chance to become the most beautiful day of your life.


原创粉丝点击