无法找到有关此内容但如果我找到这样的代码
fixed(Foo* foo=bar) {
doSomething(bar); // not foo
}
其中 foo 未被引用,我是否可以确定 bar 在区域内保持固定而未因优化而消失?
答案 0 :(得分:4)
是。这就是fixed
声明的重点,正如规范中所述:
对于由 fixed-pointer-initializer 计算的每个地址,fixed语句确保地址引用的变量在固定语句的持续时间内不受垃圾收集器的重定位或处理。例如,如果 fixed-pointer-initializer 计算的地址引用了对象的字段或数组实例的元素,则fixed语句保证包含的对象实例不会被重定位或处理在声明的有效期内。
在您的情况下, fixed-pointer-initializer 为bar
。出于语法原因,需要声明foo
。这可能是这个成语的原因,数组bar
必须是不可移动的,但你并不需要指针。
一方面注意:优化不能使bar
远离此类fixed
语句之外的内存位置。这是垃圾收集器压缩堆以确保它不再碎片化。不过,我不会称之为优化。