C# c固定区域优化

C# c固定区域优化,c#,fixed,region,C#,Fixed,Region,找不到关于此的任何信息,但如果我找到这样的代码 fixed(Foo* foo=bar) { doSomething(bar); // not foo } 在没有引用foo的地方,我能确定bar在区域内保持固定,并且不会因为优化而消失吗 是的。这就是固定语句的全部要点,正如规范中所指出的: 对于由固定指针初始值设定项计算的每个地址,fixed语句确保地址引用的变量在fixed语句期间不会被垃圾收集器重新定位或处理。例如,如果由固定指针初始值设定项计算的地址引用对象的字段或数组实例的元素,则固

找不到关于此的任何信息,但如果我找到这样的代码

fixed(Foo* foo=bar) {
  doSomething(bar); // not foo
}

在没有引用foo的地方,我能确定bar在区域内保持固定,并且不会因为优化而消失吗

是的。这就是固定语句的全部要点,正如规范中所指出的:

对于由固定指针初始值设定项计算的每个地址,fixed语句确保地址引用的变量在fixed语句期间不会被垃圾收集器重新定位或处理。例如,如果由固定指针初始值设定项计算的地址引用对象的字段或数组实例的元素,则固定语句保证在语句的生存期内不会重新定位或处理包含该对象的实例

在您的例子中,固定指针初始值设定项是bar。然而,出于语法原因,需要声明foo。这可能就是这种习惯用法的原因,即数组条必须是不可移动的,但实际上并不需要指针


有一点值得注意:并不是优化可以将bar从固定语句之外的内存位置移开。垃圾收集器压缩堆以确保堆不再碎片化。但我不认为这是一个优化。

Eh,它真的是C,不是,比如说,C还是C++?看起来像C,我看不到一个固定的条点,不用指针Foo,除非这个点是为了让垃圾收集器效率低一些,谢谢你精心的回答。通过谷歌搜索部分规范,我无意中发现了这篇文章,这篇文章似乎有所不同:它解释了固定区域不会固定对象,而是插入GC可以改变的偏移量。这听起来很疯狂-它可以在.NET文档或类似文档中的某个地方得到验证吗?不过,如果我没看错的话,情况就不同了。他们试图锁定数组中包含的结构的属性,这似乎让事情变得很奇怪。