C++学习笔记 堆与栈的区别

转载 2015年07月09日 15:37:26

     这里的堆与栈指程序内存分配区域,不是数据结构中的堆与栈结构。

     一个程序所占内存区域分为以下几部分

    堆区:程序员手动分配的区域,比如通过new或malloc方式获得的内存区域。存放在堆区的内存要手动释放(delete,free)。堆区的数据及时程序运行结束也不会被释放,最终可能会被操作系统释放。堆区的内存分配方式和链表相似。堆区容量较大,使用灵活,但是速度比栈慢。堆的空间不是连续的(链表嘛)。

     栈区:存放局部变量的区域(函数参数也是局部变量)。分配方式类似于数据结构中的栈(先进后出)。栈有系统自动分配和释放。栈的空间较小,据说windows下是2M。栈的空间是连续的空间。

     全局区和静态区:全局变量和静态变量存在一个区域。初始化了的放在一个区域,没初始化的放在相邻的另一块。程序结束后由操作系统释放。

     文字常量区:存放常量字符串的区域。程序结束后释放。

     代码区:存放二进制代码。

     下面代码作为例子(网上找的)

      

       int a = 0; 全局初始化区 

       char *p1; 全局未初始化区 

       main() 

       { 

            int b; 栈 

            char s[] = "abc"; 栈 

            char *p2; 栈 

            char *p3 = "123456"; 123456\0在常量区,p3在栈上。 
 
            static int c =0; 全局(静态)初始化区 

            p1 = (char *)malloc(10); 

            p2 = (char *)malloc(20); 

            分配得来得10和20字节的区域就在堆区。 

            strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 

        } 
      ----------------------------------------------------------------------------------------------------------------------------------------------------------- 
      网上还看到了一个新知识,记在这里:
       
       char s1[] = "aaaaaaaaaaaaaaa"; 

       char *s2 = "bbbbbbbbbbbbbbbbb"; 
      初始化字符串的两种方式,以前一直以为两种方法是等价的,但是竟然有区别,看来大一时候就没学明白。。。
      第一行代码是在运行时赋值的,第二行在编译时就确定了。在以后的存取中,用第一种方法会快一些。
    比如:    
  #include    
  void   main()    
  {    
  char   a   =   1;    
  char   c[]   =   "1234567890";    
  char   *p   ="1234567890";    
  a   =   c[1];    
  a   =   p[1];    
  return;    
  }    
  对应的汇编代码    
  10:   a   =   c[1];    
  00401067   8A   4D   F1   mov   cl,byte   ptr   [ebp-0Fh]    
  0040106A   88   4D   FC   mov   byte   ptr   [ebp-4],cl    
  11:   a   =   p[1];    
  0040106D   8B   55   EC   mov   edx,dword   ptr   [ebp-14h]    
  00401070   8A   42   01   mov   al,byte   ptr   [edx+1]    
  00401073   88   45   FC   mov   byte   ptr   [ebp-4],al    
  第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到  
  edx中,再根据edx读取字符,显然慢了。    
    

C++堆和栈的区别和联系

C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。 堆:是由new分配的内存块...
  • yangyong0717
  • yangyong0717
  • 2017年09月16日 10:39
  • 312

C语言(C++)堆和栈的区别

非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 转自:http://www.cppblog.com/oosky/archive/2006/01/21/2958.html 堆和栈的区...
  • dddd0216
  • dddd0216
  • 2016年06月09日 15:17
  • 1074

编程_堆和栈的区别

本文简单介绍了堆和栈的区别。
  • cc214042
  • cc214042
  • 2016年10月03日 18:19
  • 1417

堆和栈的概念和区别

在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分:       Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存...
  • pt666
  • pt666
  • 2017年04月27日 19:06
  • 2870

java 内存模型(堆和栈的区别)

Java把内存分为栈内存和堆内存。两者的主要区别是:   栈内存 堆内存     存放内容 (1)在函数中定义的基本类型变量 (2)在函数中定义的对象的引用变量   ...
  • qilixiang012
  • qilixiang012
  • 2014年07月03日 00:16
  • 891

C/C++中栈(stack)与堆(heap)的区别

栈(stack) 由编译器自动分配释放管理。局部变量及每次函数调用时返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。新被调用的函数在栈上为其自动和临时变量分配存储空间。 堆(heap...
  • seanchen88
  • seanchen88
  • 2016年11月29日 08:57
  • 452

C++中栈和堆的区别及区分对象存储在堆或栈中的方法

刚开始学习C++,记录下点点滴滴,同时也分享下 栈: 函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限...
  • xiaoruanzhu
  • xiaoruanzhu
  • 2016年10月20日 11:19
  • 1070

栈与堆理解与区别

栈与堆
  • u013908944
  • u013908944
  • 2017年04月08日 09:47
  • 539

单片机全局变量 局部变量 堆与栈 的区别

单片机全局变量 局部变量 堆与栈 的区别 局部变量空间,就是堆栈空间,也就是栈空间。 从局部变量声明的时候,它就在堆栈空间了,而不是调用函数的时候,才让它入栈的。 定义一个局部变...
  • zsh2011
  • zsh2011
  • 2013年04月21日 20:07
  • 1529

Java中的基础----堆与栈的介绍、区别

堆和栈都是Java中常用的存储结构,都是内存中存放数据的地方。 栈:基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量...
  • Emira_J
  • Emira_J
  • 2016年04月24日 11:16
  • 16791
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++学习笔记 堆与栈的区别
举报原因:
原因补充:

(最多只允许输入30个字)