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个区,分别是堆、栈、

C++学习笔记17,构造函数体内初始化数据成员与构造函数初始化器的区别(一)

在构造体内初始化数据成员是最常见的方法。 例如: #include using namespace std; class A { private: int i; string s; publ...

C++学习笔记之——vector的size和capacity、resize和reserve的区别

在使用STL中的vector时,对于size和capacity、resize和reserve的使用很是模糊。于是这篇博文就诞生了,主要是加深自己的理解和方便日后查阅。 在vector中size()和c...

C++学习笔记15 malloc free 与 new delete的区别

#include #include /* run this program using the console pauser or add your own getch, system("pa...

【从C到C++学习笔记】内敛函数/内敛函数与带参数宏的区别/新的类型转换运算符

C/C++学习笔记(十一)string和string.h文件的区别

在C/C++学习笔记(六)中记录了头文件和源文件的探讨,本文将继续探讨更多的相关知识。 #include 当我们使用#include 命令时,编译器就到这个文件夹里去找对应的文件。显然,用这种写...

C/C++学习笔记11:指针与引用的区别

在《C语言程序设计(第三版)》谭浩强著这本教材中关于指针与引入的b

C++学习笔记(二)C风格字符串和string类区别和联系

一、概述 有时候在使用字符串时,总把C++的字符串类型和C风格的字符串混淆,或者独立为不同概念,为此特定查找资料,总结两者之间的区别和联系。如有错误,恳请指出。 二、C语言中的字符串 在C语言中...

C++学习笔记(1)之传值、传指针、传引用的区别

1.引用和指针的区别:引用定义就要初始化、引用初始化后不能引用其他的引用、不能给引用赋空值,引用具有 1)不占空间  2)效率 3)安全优点 2.什么时候使用指针,什么时候又该使用引用? 指针和引...

【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++学习笔记 堆与栈的区别
举报原因:
原因补充:

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