C#堆和栈

摘要:
堆和堆栈是两种可以分配的内存类型。堆栈存储代码的运行路径。堆叠就像整齐放置的盒子。我们可以很容易地在堆中找到所需的对象。默认情况下,我们访问顶部堆栈。当执行堆栈中的方法时,它们将被丢弃。然后我们继续搜索顶框,直到找到合适的。左边是堆栈,右边是堆。堆栈由内存自行维护。堆需要垃圾收集机制。堆和堆栈主要存储四种类型的数据:值类型、引用类型、指针和指令。X=1,y=2依次放置在堆栈上,就像建造房子一样。x=1位于底部,堆栈基于“先入后出”的规则。

堆和栈是两种可以分配的内存。

保存代码的运行路径。堆保存对象

栈好比整齐摆放的盒子。堆则好比杂乱无章的盒子。

在堆中我们可以轻易找到需要的对象,而由于默认访问最顶端的栈,当栈中的方法执行完毕之后就会丢弃,然后继续查找最顶端的盒子,直到发现合适的。

C#堆和栈第1张

借用其他博主的图片。左边是栈,右边是堆。

栈是内存自主维护的。而堆则需要垃圾回收机制

堆和栈主要存放了四种类型的数据:值类型,引用类型,指针和指令。

值类型和引用类型

C#堆和栈第2张

指针:

由公共语言运行时(CLR)来管理。自身占用内存,指向对象的内存地址。它的值为空或者是内存地址。

引用类型总是放在堆上

值类型和指针总是放在他们被声明的地方

使用如下例子解释:

public void Method(int z){
    int x=1;
    int y=2;

    A  a=new A();
    a.Result=z+2;  
}

方法与方法的参数放置在栈上。

x=1,y=2依次被放在栈上,就像砌房子一样,x=1在下,栈依据先进后出的规则。

a为引用对象,放置在堆上。

z为方法的参数,显然是在栈上。那么就会在栈上生成一个指向含有a的那个堆的指针。

在方法结束之后。栈上的变量和指针全部清空。也就是这里的x,y,z以及指向a的指针(指针也占内存)。

而在堆上的变量a并没有立即删除。需要等到垃圾回收机制来回收变量。

还有一个典型的例子:

A a1=new A();
a1.Result=3;
A  a2=a1;
a2.Result=4;

此时a2.Result依然是3.因为将a1赋值给a2,实际是将a2指向a1的堆内存地址,值不会变。

免责声明:文章转载自《C#堆和栈》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Topology and Geometry in OpenCascade-Vertex全面质量管理-质量管理水平(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

通过实例学习C#开发中的泛型

C#中所谓泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。   C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。   C#泛型机制简介   C#泛型能力由CLR在运行时支持,区别于C++的编译时模板机制,和java的编译时的“搽拭法”。这...

fsetpos()与fgetpos()详解

转载自新浪博客:http://blog.sina.com.cn/s/blog_695e489c01012us3.html fsetpos()详解 函数原型:int fsetpos(FILE *fp, const fpos_t *pos); 头文件:#include <stdio.h> 是否是标准函数:是 函数功能:将文件指针定位在pos指定的位...

C++ this指针

1. this指针的用处:   一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各...

【转载】数据结构之图(存储结构、遍历)

一、图的存储结构 1.1 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 看一个实例,下图左就是一个无向图。 从上面可以看出,无向图的边数组是一个对称矩阵。所谓对称矩阵就是n阶矩阵的元满足aij= aji。即从矩...

C/C++ 关于数组和指针的总结

1、数组的声明形如a[d],其中a是数组的名字,d是数组的维度,编译的时候数组的维度应该是已知的,所以维度d必须是一个常量。如果要定义一个不知道元素个数的以为数组,那么请使用vector容器; unsigned cnt = 42; //不是常量表达式 constexpr unsigned sz = 42; //常量表达式 int arr...

海康SDK编程指南(C#二次开发版本)

海康SDK编程指南 目前使用的海康SDK包括IPC_SDK(硬件设备),Plat_SDK(平台),其中两套SDK都需单独调用海康播放库PlayCtrl.dll来解码视频流,返回视频信息和角度信息。本文仅对视频监控常用功能的使用进行说明,其它未实现功能请参看设备网络SDK使用手册和播放库编程指南V7.2。 IPC_SDK编程指南 (一) SDK的引用 由于I...