C++内存模型

C++的内存模型

根据c++对象的生命周期不同,内存模型有三种不同的内存区域

  • 自由存储区:局部非静态变量的存储区域,即栈
  • 动态区:用new、malloc分配的内存,即堆
  • 静态区全局变量、静态变量,字符串常量存在的位置
    代码虽然占内存,但不属于内存模型
栈和堆的区别
  • 申请方式
    栈由系统自动分配和管理,而堆是手动分配和管理
  • 扩展方向
    栈从高地址向低地址扩展,堆是由低地址向高地址扩展
  • 程序局部变量使用的是栈空间,函数调用时兴参和返回值的压栈出栈也是栈空间,new和malloc使用的是堆空间

栈的效率高的原因

栈式操作系统提供的数据结构,计算机底层为栈提供了一系列的支持:分配专门的寄存器存储栈的地址,压栈和入栈有专门的指令执行。

C++的内存分区

  • :编译器自动分配释放,存放函数的参数值,局部变量的值
  • :手动分配和释放,需要通过new和malloc来申请内存,且必须在不使用时通过 delete和free释放
  • 静态存储区全局静态变量、局部静态变量、全局变量以及虚函数表
  • 常量存储区全局常量、函数指针
  • 代码区:代码的只读区域
    总结:无栈无法申请内存空间,无堆无法调用函数,无静态存储区无法多态,无常量存储区无函数。

在Linux系统中,程序在内存中的分布
在这里插入图片描述

  • .txt 为编译后程序的主题,即程序的机器指令
  • .data:全局初始化数据区/静态数据区,只初始化一次
  • .bss: 未初始化数据区。在运行时改变其值
  • 堆中保存动态分配的内存
  • 栈用来进行函数调用,以及局部变量

为什么分成这么多区域

  • 一个进程在运行过程中,代码是根据流程依次执行的,只需要访问一次,由于跳转和递归有可能使代码执行多次,而数据一般都需要访问多次,因此单独开辟空间以方便访问和节约空间。
  • 临时数据及需要再次使用的代码在运行时放入栈区中,生命周期短。
  • 全局数据和静态数据有可能在整个程序执行过程中都需要访问,因此单独存储管理。
  • 堆区由用户自由分配,以便管理。
int a = 0; //a在全局已初始化数据区
char *p1; //p1在BSS区(未初始化全局变量)
int main(){
int b; //b在栈区
char str1='a' //字符常量,常量存储区(低地址)
char str2[] = "abc"; //数组变量,存储在栈区(高地址)
char *p1,*p2; //p1、p2在栈区
static int c =0//C为(静态)数据,存在于已初始化数据区
p1 = (char *)malloc(10);//分配得来的10个字节的区域在堆区
p2 = (char *)malloc(20);//分配得来的20个字节的区域在堆区
free(p1);
free(p2);
}
char *str1='a' 
char *str2='a'
char str3[] = "abc"
char str4[] = "abc"
str1==str2
str3!=str4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《操作系统原理》实验指导书 实验一 生产者-消费者模型模拟进程调度 一、实验任务 1、在WINDOWS 2000环境下,创建一个控制台进程,此进程包括4个线程:2个生产者线程和2个消费者线程。 2、用信号量机制解决进程(线程)的同步与互斥问题。 二、实验目的 1.掌握基本的同步互斥算法,理解生产者和消费者模型。 2.了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 3.学习使用Windows 2000/XP中基本的同步对象,掌握相应的API。 三、实验要求 1.生产者消费者对缓冲区进行互斥操作。 2.缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3.生产者消费者各循环操作50次。 四、设计思路和采取的方案 1.利用windows提供的API函数CreateSemaphore()创建信号量对象; CreateThread()创建线程; WaitForSingleObject()执行P操作; ReleaseSemaphore()执行V操作; WaitForMultipleObjects()主进程等待线程的结束等函数进行设计。 2.在Windows中,常见的同步对象有:信号量(Semaphore)、互斥量(Mutex) 。 使用这些对象都分为三个步骤,一是创建或者初始化; 接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;最后释放该同步对象,这对应于互斥量的解锁。这些同步对象在主进程中创建,在其子线程中都可。 实验二 存储管理 一、目的和要求 1. 实验目的 (1)掌握时间片轮换的进程调度算法; (2)掌握带优先级的进程调度算法; (3)选用面向对象的编程方法。 2、实验学时:2学时 3、实验要求 (1)自定义PCB的数据结构; (2)使用带优先级的时间片轮转法调度进程,每运行一个时间片,优先级减半。 (3)命令集 A)create 随机创建进程,进程的优先级与所需要的时间片随机决定; B)ps 查看当前进程状态 C)sleep 命令将进程挂起 D)kill 命令杀死进程 E)quit命令退出 二、实验内容 根据教师指定的实验课题,完成设计、编码、测试工作。 实验三 虚拟存储器 一、目的和要求 1. 实验目的 (1)掌握先进先出页面置换算法; (2)掌握随机替换页面置换算法; (3)掌握OPT页面置换算法; (4)掌握最近最少使用页面置换算法; (5)熟悉抖动现象及其产生原理; (6)熟悉C/C++编程。 2、实验学时:2学时 3、实验要求 (1)进程占用内存空间共640K,页面大小是1K/2K/4K/8K; (2)随机生成256个页面置换次序; (3)用于分配页面大小的内存总空间是32K; (4)给出四种页面置换算法的换页过程,并计算各自的缺页率。 二、实验内容 编写程序,使用四种不同的页面替换策略算法进行页面替换。分别是先进先出,随机替换,时钟页面替换,最近最久未使用页面替换,并计算缺页率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值