028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

C/C++堆和栈的区别

预备知识—程序的内存分配

一个由C/C++编译的程序占用的内存分为以下几个部分

创新互联致力于网站建设、网站制作,成都网站设计,集团网站建设等服务标准化,推过标准化降低中小企业的建站的成本,并持续提升建站的定制化服务水平进行质量交付,让企业网站从市场竞争中脱颖而出。 选择创新互联,就选择了安全、稳定、美观的网站建设服务!

    • 栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
      操作方式类似于数据结构中的栈。
    • 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
      收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
    • 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的
      全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另
      一块区域。 - 程序结束后由系统释放。
    • 文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放
    • 程序代码区:存放函数体的二进制代码。

例如:

#include "stdio.h"
int a = 0;//全局初始化区 
char *p1;//   全局未初始化区    
void main(void)    
{    
        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";
aaaaaaaaaaa 是在运行时刻赋值的;
而 bbbbbbbbbbb 是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。

例如:

#include "stdio.h" 
void main(void) 
{
    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++ 堆和栈的区别


网页题目:C/C++堆和栈的区别
分享URL:http://www.tsicrk.com/article/pejoph.html

其他资讯

让你的专属顾问为你服务

0.6913s