C#内存管理一

来源:互联网 发布:日本电装公司 知乎 编辑:程序博客网 时间:2024/05/21 11:33

尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识。明白内存管理的基本行为将有助于我们解释我们程序中变量是如何操作的。在本文中我将讨论栈和堆的一些基本知识,变量的类型和某些变量的工作原理。

当你在执行程序的时候内存中有两个地方用于存储程序变量。如果你还不知道,那么就来看看堆和栈的概念。堆和栈都是用于帮助我们程序运行的,包含某些特殊信息的操作系统内存模块。那么堆和栈有什么不同呢?

堆VS栈的区别

栈主要用于存储代码,自动变量等信息;而堆则主要用于存储运行期生成的对象等信息。将栈看作是一个有着层级关系的盒子,我们每一次只能操作盒子最上一格的东西。这也就是栈先进后出的数据结构特性。因此栈在我们程序中主要是用于保存程序运行时的一些状态信息。堆则主要是用于保存对象内容,以便我们能够在任何时候去访问这些对象。总的来说,堆就是一种数据结构,我们不需要通过一套规则,可以随时访问的内存区域;栈则总是依据先进后出的,每次只能访问最顶层元素的内存区域。下面是个示意图:

由于栈的特性所至,所以栈具有自我维护性,栈的内存管理可以通过操作系统来完成。而堆的管理就需要通过GC(垃圾回收器)来完成,使用一定的算法来扫描并释放没有用的对象。

关于栈和堆的更多内容

我们代码中有四种主要的类型需要存储在栈和堆当中:值类型,引用类型,指针和程序指令。

值类型:

在c#中主要的值类型有:

bool ,byte ,char ,decimal ,double ,enum ,float ,int ,long ,sbyte ,short ,struct ,uint ,ulong ,ushort都来自于System.TypeValue。引用类型:

在C#中主要的引用类型有:class, interface, delegate,object,string所有的引用类型都继承自System.Object。指针:在我们的内存管理中一个指针的意义就是一个引用对应到一个类型上。在.net framework中我们不能显式的使用指针,所有的指针都被通用语言运行时(CLR)管理。指针是一块指向其他内存区域的内存区域。指针需要占据一定的内存空间就像其他任何数据一样。

指令:指令就是计算机执行代码,如函数调用或是数据运算等。 内容和地址的问题

首先有两点需要说明:

1.引用类型总是存在于堆里 – 很简单,但是完全正确吗?

2.值类型和指针总是出现在他们声明的地方。这个有点复杂需要相关的栈工作原理的知识。

栈就像我们之前提到的那样,记录我们程序执行时的一些信息。当我们在调用一个类的方法时,操作系统将调用指令压栈并附带方法参数。然后进入函数体处理变量操作。这个可以用下面的代码来解释:

public int AddFive(int pValue) {
        int result;
        result = pValue + 5;
        return result;
}

原创粉丝点击