内存的五大区域

一、 在c中分为这几个存储区

内存区域 存放内容 释放时间
在函数体中定义的变量通常是在栈上 由编译器自动分配释放
用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
全局区(静态区) 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束释放
常量区域 函数中的"adgfdf"这样的字符串存放在常量区 程序结束释放
程序代码区 存放二进制代码 /

注意:在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。

int a = 0; //全局初始化区
char *p1; //全局未初始化区

void main()  {
int b; //栈
char s[] = "abc"; //栈
char *p2;  //栈
char *p3 = "123456";   / /123456{post.content}在常量区,p3在栈上
static int c = 0;  //全局(静态)初始化区

p1 = (char *)malloc(10);  //分配得来得10字节的区域在堆区
p2 = (char *)malloc(20); //分配得来得20字节的区域在堆区

strcpy(p1, "123456");   //123456{post.content}放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块
}
  • 堆栈基本对比
是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活 是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低
栈是系统数据结构,对于进程/线程是唯一的 堆是函数库内部数据结构,不一定唯一;不同堆分配的内存无法互相操作;
栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的 堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存
  • 堆栈 - 在释放内存方面的对比
碎片问题 对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低 对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出
生长方向 生长方向是向上的,也就是向着内存地址增加的方向 生长方向是向下的,是向着内存地址减小的方向增长
分配方式 堆都是动态分配的,没有静态分配的堆 栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现
分配效率 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高 堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,764评论 18 399
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,874评论 0 27
  • 1、c语言的函数有以下特点: (1)才源程序由函数组成,一个主函数main()+若干其他函数 C程序中的函数类似文...
    滕王阁序阅读 1,370评论 0 6
  • 1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”? 答:首先,extern是C/C...
    曾令伟阅读 926评论 0 4
  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 5,031评论 0 13