C++ 代码的存储

       一般情况由C++编译的程序所占用的内从分为以下几个方面:
         1   栈(stack)程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。
   2 堆(heap)在内从中开辟另一片空间,由程序员自己分配,比如(new/delete),如果程序员自己在程序结束时不释放开辟的空间, 操作系统也会释放此空间, 但是有例外情况, 在此不详述,后面的文章会讲到。
堆与数据结构中的链表类似, 并不是像数据结构中的堆。
   3 静态存储区(全局区) 编译器编译时就会分配内存,全局变量和静态变量存储在同一片区域, 初始化的全局变量和静态变量存在一片区域, 而没有初始化的全局变量存储在另一片区域。 程序结束时由系统统一释放。
   4
文字常量区  常量字符串就是放在这里的。 程序结束后由系统释放。
   5 程序代码区—存放函数体的二进制代码。
   对于这些解释用下面的一个程序来说明:
   #include <iostream>
  
int a = 0; //全局初始化区
   char *p1; //全局未初始化区
   int main()
   {
   int b; //栈
   char s[] = "abc"; //栈
   char *p2; //栈
   char *p3 = "123456"; //123456在常量区,p3在栈上。
   static int c =0;//全局(静态)初始化区
   p1 = new char[10];
   p2 = new char[20];
   //分配得来得和字节的区域就在堆区。

   }

   a 和*p1是全局变量所以存储在静态存储区, 而b , s[],*p2, *p3为局部变量都存储在栈中, 而c虽是局部变量由于是static所以也存放在静态存储区(全局区),因为它存在于全局变量中所以离开函数体时并不是立刻销毁C, 当程序结束时才销毁。
   其中对于堆和栈有很大的区别, 在此简单的总结以下:
   1 管理方式不同: 栈是系统自动分配, 而对于堆来说申请释放由用户控制。
   2 空间大小不同: 对于栈来说通常它的大小是固定的,只是对于不同的OS也许大小不同而已, 所以只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则 将报异常提示栈溢出。 而堆相对来说比较大, 它只受限于计算机内有效的虚拟内存。 所以比较灵活。
   3 是否产生碎片不同: 由于new/delete的频繁操作势必会造成空间的浪费, 存在内存碎片, 而栈不会。
   4 生长方向不同: 栈是向内存低地址方向延伸, 而堆是向内存高地址延伸。
   5 分配方式效率不同: 由于栈是系统管理分配,所以效率会高一些。
   堆和栈各有好处, 栈的效率高, 但是分配不灵活, 对于大内存需求无法满足, 而堆分配灵活,效率低, 也容易造成内存碎片。
   无论是堆还是栈都要防止越界, 因为越界容易造成程序崩溃。 

   如果有错误请各位指出。谢谢!

一. 实验目的: 1.通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法 2.通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 二.实验要求 实验程序由以下三大部分组成: (1) 通过随机数产生一个指令序列(实际上是指令的逻辑地址序列),共320条指令。指令的地址按下述原则生成: A:50%的指令是顺序执行的 B:25%的指令要实现向前跳转,均匀分布在前地址部分 C:25%的指令要实现向后跳转,均匀分布在后地址部分 具体的实施方法是: A:在[0,319]的指令地址之间随机选取一起点m B:顺序执行一条指令,即执行地址为m+1的指令 C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’ D:顺序执行一条指令,其地址为m’+1 E:在后地址[m’+2,319]中随机选取一条指令并执行 F:重复步骤A-E,直到320次指令 (2) 将每条指令的逻辑地址变换为页地址 设:页面大小为1K; 用户内存容量4页到32页; 用户虚存容量为32K。 在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为: 第 0 条-第 9 条指令为第0页(对应逻辑地址为[0,9]) 第10条-第19条指令为第1页(对应逻辑地址为[10,19]) ……………………………… 第310条-第319条指令为第31页(对应逻辑地址为[310,319]) 按以上方式,用户指令可组成32页。 (3) 分别使用FIFO算法和LFU算法,计算给用户进程的这32页分配4,5,…,32个页面(内存块)时其缺页率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值