关闭

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

标签: C++学习笔记 堆与栈的区别
116人阅读 评论(0) 收藏 举报
分类:

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

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

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:342次
    • 积分:24
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档