C/C++ 堆和栈的区别

发布时间:2020-07-05 12:07:48 作者:patrick_dai
来源:网络 阅读:3748

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

一个由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++ 堆和栈的区别

推荐阅读:
  1. Windows怎么配置VSCode+CMake+Ninja+Boost.Test的C++开发环境
  2. Ubuntu16.04下如何配置VScode的C/C++开发环境

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c/c++ 堆栈 c+

上一篇:Android新建Activity Theme设置无标题

下一篇:vs2015关于“当前不会命中断点 还没有为该文档加载任何符号”的解决方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》