第12章 内存管理和指针

题外话: 自从过完年,找不到一件事能让自己安下心去做的。三天打鱼两天晒网,从来都是如此,在一次次感叹中拿起书,眼睛是动了,在脑子里却不留任何痕迹。何时解? Let's go!

1.32位的操作系统会被每一个程序分配4GB的内存。

2.堆栈从内存地址向低内存地址填充,堆上的内存是向上分配的。

3.垃圾收集器在释放了能释放的所有对象,会把其他对象移动回堆得顶部。再次形成一个连续的块。

4.释放未托管的资源的两种方法。a.声明一个析构函数,b.在类中执行System.IDisposable接口。最好的方法是执行这两种机制。

5.用unsafe关键字编写不安全代码。unsafe可以标记方法,参数,类,结构或类对象成员。但是不可以用于局部变量。

6.指针的语法 符号*表示一个指针,变量名通常以P开头例如 int* pWidth.指针不能指向引用类型。

  & 表示“取地址”,并把一个值数据类型转换为指针,

  * 表示 "获取地址的内容" ,把一个指针转换为值数据类型

  & 和 * 的作用是相反的

  例如:int x = 10;

           int* pX,pY;

           pX=&x;

          pY=pX;

          *pY=20;

7. void 指针 ,如果需要一个指针,但不希望指定它指向的数据类型,可以声明为void。不可以对void 指针执行算数运算

8. 指针成员访问 运算符 ->s

  例如 pStruct ->X = 4;

  也可以把合适类型的指针设置为指向结构中的一个字段

 例如: long* pL=&(Struct.X)

    或: long* pL=&(pStruct->X)

9 类成员指针,前面说过,不能创建指向类的指针,因为垃圾收集器不维护指针的任何信息。

   但是,大多数类包含值类型的成员,可以为这些值类型成员创建指针,需要一种特殊的语法。fixed

  例如: MyClass myObject - new MyClass();

            long* pL = &(myObject.X) // wrong--compilation error

   可以使用: MyClass myObject - new MyClass();

                    fixed(long* pL = &(myObject.X))

                    {

                        // do something

                      }

10. 使用指针优化性能

     1.创建基于堆栈的数组

       数组是对性,如果希望创建一个时间比较短的高性能数组,可以使用 stackalloc。调用它,需要两条信息。a.要存储的数据类型.b需要存数的数据项数。(只能创建一维)

例如:decimal* pDecimals = stackalloc decimal [10];  //这只是分配内存,不会初始化

 访问第一元素并赋值: *pDecimals = 3.0;

访问下表为X的元素 :    *(pDoubles + X) = 8.4;

也可以使用 : pDecimals[0] = 3.0

如果使用数组 double[] myDoubleArray = new double[20];

                   myDoubleArray[50] = 3.0 \\会抛出异常

使用指针数组 double* pDouble = statckalloc double[20];

                   pDouble[50] = 3.0 \\不会抛出异常。如果此位置被其他变量所占用,则会需该其值。

后话:怎么感觉自己总结的那么肤浅,一点价值都没有。

posted on 2011-03-07 17:21  小齐宝  阅读(163)  评论(0)    收藏  举报

导航