博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++内存区域划分详解
阅读量:3971 次
发布时间:2019-05-24

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

C/C++内存区域划分详解

C/C++内存分布

在这里插入图片描述

C/C++中,内存主要分为、堆、栈、全局/静态存储区和常量存储区。

:栈又叫堆栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等,是向下增长的。所谓向下生长的就是,先调用的栈帧的地址比后调用的地址大,栈一般大小有几个M左右。

#include
using namespace std;void f2(){
int b = 0; cout << "b:" << &b << endl;}void f1(){
int a = 0; cout <<"a:" <<&a << endl; f2();}int main(){
f1(); return 0;}

在这里插入图片描述

:就是那些由new/malloc分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new/malloc就要对应一个delete/free,由程序员主动释放。堆是可以上增长的.意思是先建立的堆的地址小于后建立的堆的地址。

#include
using namespace std;int main(){
void* p1 = malloc(10); void* p2 = malloc(10); cout << p1 << endl; cout << p2 << endl; return 0;}

在这里插入图片描述

数据段:存储全局数据和静态数据。
代码段:可执行的代码/只读常量

知道了内存分布,下面就来做题吧,考验知识的时候到了,看看会做几题吧

在这里插入图片描述

是不是前几题还得心应手,后面就有点懵了

在这里插入图片描述

在这里插入图片描述
栈和堆的区别:

:由编译器自动分配并且释放,一般存储函数的参数局部变量等

堆:由程序员分配释放,若程不释放则系统释放

1、申请内存方式

栈:由系统自动分配,如变量的声明的同时会开辟空间,(int a; 开辟4个字节的空间)(静态指定)

堆:由程序员申请,需要制定大小(动态分配)

2、系统响应的不同

栈:只要剩余空间大于申请内存,系统就会提供,否则会栈溢出

堆:便历空闲地址链表,找到符合要求的,就删除该地址分配给程序,内存的首地址记录分配的大小,(方便delete)多余的内存回收

3、空间大小不同

栈:连续的,编译时就确定的常数
堆:不连续,他的上限决定于系统中有效的虚拟内存
4、执行效率的不同
栈:由系统分配,速度快
堆:程序员分配,速度慢,容易产生内存碎片,不过用起来方便

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

你可能感兴趣的文章
Flutter UI基础 - 布局之Row/Column/Stack
查看>>
Flutter UI基础 - 层叠布局Stack的使用
查看>>
Go - 解决 go get 超时问题
查看>>
SQL - SQL Server 之遍历数据集合的几种方法
查看>>
SQL - SQL Server 之处理JSON数据
查看>>
SQL - SQL Server 之WHILE循环的坑
查看>>
SQL - SQL Server 性能优化之SQL语句总结
查看>>
Docker - docker-compose常用命令
查看>>
SQL - SQL Server判断字符串中是否有中文
查看>>
SQL - SQL Server查询近7天的连续日期
查看>>
SQL - SQL Server中如何取年、月、日 -DATEPART函数
查看>>
SQL - SQL Server 一列或多列重复数据的查询,删除
查看>>
NET - .NET Core WebAPI + Vue + Axios 导出Excel / CSV
查看>>
NET - NET Core quartz.net 时间表达式----- Cron表达式详解
查看>>
NET - .NET Core 之 Abp Audit-Logging
查看>>
NET - .NET Core 之 Abp 整合 Quartz
查看>>
android 各式各样progress 进度条大全
查看>>
开发Google眼镜的app
查看>>
Android base-adapter-helper 源码分析与扩展
查看>>
Android 4.4从图库选择图片,获取图片路径并裁剪
查看>>