fixed是什么?
MSDN解释如下:
fixed语句阻止gc对可移动变量进行重定向。fixed语句可以设置一个指针关联到托管变量,并且在执行fixed语句过程中,锚定该变量(即gc不管该变量)。托管变量的指针只在fixed上下文有效。
为什么要用fixed?
回收机制是采用根标记堆上的对象,当根不可达时则回收堆所占的内存当回收完毕时的下一阶段就是压缩内存,这个阶段垃圾回收器线性的便利堆,以寻找未标记(垃圾)对象的连续内存块,
如果发现的内存块比较小,垃圾回收期会忽略它们,但是,如果发现大的,可用的连续内存块,垃圾回收器会把非垃圾的对象移动到这里以压缩堆。
当我们的程序强调性能优先时,可以使用该语句。
byte[] arr = new byte[] { 1, 2, 3, 4 }; unsafe { fixed (byte* p = arr) { int sum = 0; for (int i = 0; i < arr.Count(); i++) { sum = sum + p[i]; } } }