找不到任何关于这方面的信息,但如果我找到这样的代码
fixed(Foo* foo=bar) {
doSomething(bar); // not foo
}
如果foo没有被引用,我能确定bar在区域内保持固定,并且由于优化而没有消失吗?
是。这就是fixed
语句的全部要点,正如规范中所指出的:
对于由固定指针初始值设定项计算的每个地址,fixed语句确保地址引用的变量在固定语句期间不会被垃圾收集器重新定位或处理。例如,如果固定指针初始值设定项计算的地址引用了对象的字段或数组实例的元素,则固定语句保证在语句的生存期内不会重新定位或处理包含的对象实例。
在您的情况下,固定指针初始值设定项是bar
。然而,由于语法原因,需要声明foo
。这可能就是这个习惯用法的原因,其中数组bar
必须是不可移动的,但实际上并不需要指针。
有一点需要注意:并不是优化可以将bar
从fixed
语句之外的内存位置移开。它是垃圾收集器,压缩堆以确保它不再是碎片。不过,我不会称之为优化。