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

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

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

    堆区:程序员手动分配的区域,比如通过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读取字符,显然慢了。    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值