欢迎来到天天文库
浏览记录
ID:47162281
大小:113.03 KB
页数:5页
时间:2019-08-14
《浅析C_编程中的内存管理》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、浅析C#编程中的内存管理2009-03-04C#编程的一个优点是程序员不需要关心具体的内存管理,尤其是垃圾收集器会处理所有的内存清理工作。虽然不必手工管理内存,但如果要编写高质量的代码,还是要理解后台发生的事情,理解C#的内存管理。本文主要介绍给变量分配内存时计算机内存中发生的情况。C#将数据分为两种:值数据类型和引用数据类型,这两种数据类型存储在内存中的不同的地方:值数据类型存储在堆栈中,而引用类型存储在内存的托管堆中。1、内存简介Windows使用一个系统:虚拟寻址系统。这个系统的作用是将程序可用的内存地址映射到硬件内存中
2、的实际地址上。其实际结果就是32位的机子上每个进程都可以使用4GB的内存,当然,64位机这个数字就大了去了。这4GB的内存实际上包含了程序的所有的部分:可执行代码,DLL以及程序运行时使用的所有变量的内容。这个4GB的内存成为虚拟地址空间或虚拟内存。为方便,这里成为内存。4GB中的每个存储单元都是从零开始向上存储的。要访问存储在内存中的某个空间中的值,就必须提供表示该存储单元的一个数字。在高级编程语言中,编译器的一个重要作用就是负责将人们可以理解的变量名称变为处理器可以理解的内存地址。2、堆栈:如下图内存的理论上的分区0xc0
3、000000内核虚拟内存——内核使用栈区--程序运行时用于存放局部变量,可向下延展空间0x40000000共享库的内存影像----程序运行是用于分配malloc和new申请的区域堆区----的用于分配程序员申请的内存空间可读写区(.data.bss)(静态区)--用于存放全局变量和静态变量0408048000只读区存放程序和常量等0未使用区下面以一个例子来说明栈区的工作方式,如下面的代码:{ inta;//dosomething;{intb;//dosomething}}首先声明a,在内部的代码块中声明b(在栈区),然后内部的
4、代码块终止,b就出了作用域,最后a出作用域。所以b的生命周期总是包含在a的生命周期内,在释放变量的时候,其顺序总是和分配内存的顺序是相反的。即:变量的生存周期都是嵌套的(越嵌套在最里面的周期越短)。这就是栈区的工作方式。3、托管堆栈具有相当高的性能,但是变量的生命周期必须是嵌套的,这个要求在有的时候过于苛刻。我们希望有一种别的方法来分配内存,存储一些数据,并在方法退出的很长一段时间内,这些数据仍然是可用的,这时,就使用托管堆。托管堆(简称堆)是内存中的另外一个区域,我们仍然用一个例子来说明堆的工作方式,如下面代码:{Custo
5、mercustomer1;customer1=newCustomer();Customercustomer2=newCustomer();//dosomething}首先,执行第一段代码Customercustomer1;声明一个类Customer:customer1在栈上给这个引用(因为类是引用类型)分配存储空间(分配了很小的4个字节的空间,但并没有值,值为NULL),用来存储地址。请注意:仅仅是给这个引用分配存储空间(用来存储一个地址),并不是有实际的Customer对象来占用这个空间。分配给customer14个字节的空
6、间(32位机),这个空间仅仅是用来表示Customer对象在内存中(准确说是在堆区)的地址(以后CU就是指挥总线就先理论上的连接到这里按这个地址指向实际存储数据的堆区)---------好比图书馆存放图书检索卡的检索卡架子上的一小格中的一张小卡片(卡片上记录的是对应的图书存放的具体位置信息)。引用类型在内存上存储数据:这个就好比图书馆(因为图书很多,就需要有专门的分区有检索区检索架存放图书地址卡片,有专门存放图书的图书区图书架存放图书),然后,执行第二行代码customer1=newCustomer();,完成以下操作:在堆上
7、分配存储空间(这个在堆上的存储空间就好比图书馆的书架上具体一本图书存放占用的空间,而具体的图书就放在这个空间里),用来存储Customer对象(具体的图书),注意:这里是Customer对象。这个new分配了多大的内存呢,这个问题跟我们的类里面的成员的类型有关系。将变量customer1的值设为分配给Customer对象的内存地址从这个例子中可以看出,建立引用类型的变量的过程要比建立值类型变量的过程复杂,且不避免的有性能的降低。但是,我们可以将一个引用变量的值赋给另一个引用变量,当一个变量出作用域时,它会从堆栈中删除,但是对象
8、的数据仍然保留在内存中,直到程序停止。——————整个过程好比委托人帮我们在城里(堆上)买房子,买了多大的房子(在堆上分配多大内存空间),由我们预先设定的房子要求有关,比如要有多少个房间(有多少成员),房间的类别(厨房,厕所,客厅,主睡房,婴儿房,客房等,成员类型),大小都不
此文档下载收益归作者所有