博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存中堆和栈的区别,以及C语言中的内存模型
阅读量:1871 次
发布时间:2019-04-26

本文共 1510 字,大约阅读时间需要 5 分钟。

C语言的内存模型分为5个区:栈区、堆区、静态区、常量区、代码区

每个区存储的内容如下:

1、栈区:存放函数的参数值、局部变量等,由编译器自动分配和释放,通常在函数执行完后就释放了,其操作方式类似于数据结构中的栈。栈内存分配运算内置于CPU的指令集,效率很高,但是分配的内存量有限,比如iOS中栈区的大小是2M。

2、堆区:就是通过new、malloc、realloc分配的内存块,编译器不会负责它们的释放工作,需要用程序区释放。分配方式类似于数据结构中的链表。在iOS开发中所说的“内存泄漏”说的就是堆区的内存。

3、静态区:全局变量和静态变量(在iOS中就是用static修饰的局部变量或者是全局全局变量)的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后,由系统释放。

4、常量区:常量存储在这里,不允许修改。

5、代码区:存放函数体的二进制代码。

堆和栈的区别:

1、堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存。当然,iOS引入了ARC(自动引用计数管理技术)之后,程序员就不需要用代码管理对象的内存了,之前MRC(手动管理内存)的时候,程序员需要手动release对象。另外,ARC只是一种中间层的技术,虽然在ARC模式下,程序员不需要像之前那么麻烦管理内存,但是需要遵循ARC技术的规范操作,比如使用属性限定符weak、strong、assigen等。因此,如果程序员没有按ARC的规则并合理的使用这些属性限定符的话,同样是会造成内存泄漏的。

2、栈空间的内存是由系统自动分配,一般存放局部变量,比如对象的地址等值,不需要程序员对这块内存进行管理,比如,函数中的局部变量的作用范围(生命周期)就是在调完这个函数之后就结束了。这些在系统层面都已经限定住了,程序员只需要在这种约束下进行程序编程就好,根本就没有把这块内存的管理权给到程序员,肯定也就不存在让程序员管理一说。

3、从申请的大小方面讲:栈空间比较小;堆空间比较大。

4、从数据存储方面来说:栈空间中一般存储基本数据类型,对象的地址;堆空间一般存放对象本身,block的copy等。

malloc 、calloc 、realloc 、new介绍如下:

1) malloc 函数: void *malloc(unsigned int size)

     在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。

2)calloc 函数: void *calloc(unsigned int num, unsigned int size)

     按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。

    calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。

3)realloc 函数: void *realloc(void *ptr, unsigned int size)

    动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。

    申请的内存空间不会进行初始化。

4)new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。

 

转载地址:http://wjwbf.baihongyu.com/

你可能感兴趣的文章
JQuery中$.ajax()方法参数详解
查看>>
正则表达式的数字实例
查看>>
【转】EasyUI 验证
查看>>
启动mysql时,提示“Another MySQL daemon already running with the same unix socket.”解决方法
查看>>
Django项目实战---搜索引擎Elasticsearch
查看>>
Django实战---商城购物车的增删改、显示和合并购物车
查看>>
Django项目实战----订单页面的显示和生成订单、提交订单的逻辑
查看>>
Django项目实战----生成订单时高并发问题使用乐观锁
查看>>
Django项目实战----添加支付宝支付
查看>>
DRF框架---前言(简单使用)
查看>>
字符串外面是b“ “的转换 -亲测有效
查看>>
单通道和多通道卷积
查看>>
npy文件和pkl文件的保存和读取
查看>>
middle-判断二分图-深度优先和广度优先
查看>>
买卖股票的最佳时机
查看>>
AUC粗浅理解笔记记录
查看>>
torch 模型运行时间与forward没对应的可能原因
查看>>
JavaScript 的addEventListener() 事件监听详解!
查看>>
上传图片到阿里云OSS和获取上传图片的url的详解 !
查看>>
Kafka为什么这么快?
查看>>