[笔记]dotNET内存的分配、指针

原创 2007年09月19日 19:01:00

内存分配:内存中,存在Stack和Heap两种不同分配方式。实值(int, long, short等)存于Stack中,引用类型(比如类)的首地址存于Stack中,占用4字节,这个地址指向了Heap中值的地址,而该引用的实值存于Heap中。

Stack存储顺序为高位到低位,包含了一个系统指针,这个指针指向了所使用的Stack的最低位。Heap存储顺序为低位到高位,包含一个系统指针,这个指针指向所使用的Heap的最高位。

DWORD: 在32位的处理器上,它占用4字节,相当于一个无符号整数。在Windows系统中,DWORD成为最基本的内存分配单位。

值得注意的是,dotNET为每一个变量分配的内存都是4字节(或者是4字节的整数倍)。如果所申请的变量需要小于4字节,dotNET也会分配一个4字节空间给这个变量。比如说,如果你要求一个byte,虽然它是8位,系统一样会分配一个4字节的空间给它。

从这里可以发现,整数依然是最有效率的,尽量使用整数可以提高系统的效率。

指针在32位处理器上,一个指针占用4字节空间,相当于一个无符号整数,也就是说,指针可以强制转化为一个无符号的整数。这样就可以把这个地址显示出来。转化如下:int* pX; uint addrx = (uint)pX;

结构指针:在使用结构指针的时候,该结构不能包含引用类型(Class)值,否则编译器提示错误。

struct MyStruct
{
   public long X;
   public float F;
}

使用结构指针

MyStruct* pStruct;
MyStruct Struct = new MyStruct();
pStruct = &Struct;

使用指针修改结构内的值的几种方法

(*pStruct).X = 4;
(*pStruct).F = 5.2;

pStruct -> X = 4;
pStruct -> F = 5.2;

long* pX = &(Struct.X);
float* pF = &(Struct.F);

long* pX = &(pStruct->X);
float* pF = &(pStruct->F);

类指针:C#中不存在类指针的概念,由于类属于托管类型,它的建立和回收都取决于dotNET的GC(Garbage Collector)对它的管理,所以指向一个类的指针没有实际的意义(因为类一旦被销毁,则程序中其他类所在的内存地址有可能会变化,这取决于GC如何进行作业)。但是,我们仍然可以使用指针来指向类中的某一个实值变量。

public class Apple
{
public Color color;
public float weight;
public string description;
}

 这里,我们可以建立指向weight和description的指针

Apple fruit = new Apple();
float* pw = &(fruit.weight);
string* pd = &(fruit.description);

我们刚才有提到,因为类属于托管类型,所以受到GC的约束,它本身的内存地址,甚至是它所包含的实值的地址都可能变动,而造成指针的失效。为了安全起见,在使用类中的实值创建指针的时候,我们可以使用fixed关键字,来使得它的地址在fixed的范围内不变动。

Apple fruit = new Apple();
fixed (float* pw = &(fruit.weight))
{
*pw = 0.3;
}

使用嵌套,同时锁定两个值

Apple fruit = new Apple();
fixed (float* pw = &(fruit.weight))
{
   fixed (string* dw = &(fruit.description))
   {
   }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

程序员面试笔试宝典——读书笔记2、内存分配、sizeof、指针

二、内存分配 1、内存分配的形式有哪些? 一个C/C++编译的程序所占用的系统内存一般分为以下几个部分的内容: a、有符号起始的区块(BBS, Block Started by Symbol)段...

C和指针读书笔记——动态内存分配

1、数组在声明时,它所需要的内存在编译时候就被分配;    数组有其优点与缺点:优点在于是简单,缺点是(1)无法预知长度,数组无法处理程序所需要使用的元素数量超过声明的长度这种情况(2)内存浪费(3...

深入理解C指针学习笔记---多级指针的内存分配问题(五)

1.4多级指针的理解与用法1.41二维数组在内存中的布局直观上理解,二位数组array[m][n]在内存中的布局应该是一个m*n的矩阵,就像下表这样a[3][4]。 而实际上内存是一个连续的空间...

VB 指针 内存分配

Log4Net(Logging for DotNet)学习笔记

系统支持(SystemFramework):提供系统的框架支持,典型的,如异常、日志等。也有现成的,比如log4net。       突然一种老朋友似的感觉涌上心头,这不是我一直想要得到的吗?...
  • e_wsq
  • e_wsq
  • 2012-01-30 23:33
  • 415

指针与内存分配PPT

  • 2015-12-26 10:17
  • 272KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)