第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 \\不会抛出异常。如果此位置被其他变量所占用,则会需该其值。
后话:怎么感觉自己总结的那么肤浅,一点价值都没有。