繁体   English   中英

C#GC可以移动内存对象吗?

[英]Can C# GC move memory objects

让我们假设这个非常基本的C#代码:

var tab = new int[10];

我已经读过非垃圾收集器可以在内存中移动非固定变量。

我的问题是:在程序执行期间,“tab”地址是否可能发生变化?

我只想了解。

实际上,无论标签值是否改变。

是。 tab的内存地址可以(并且很可能会)更改。 参考: ECMA-334 C#语言规范 ,第23.4章。

关键是,在C#中,您不需要打扰内存地址,因为它是一种托管语言。 tab变量的所有引用都将相应地更改,并且您的程序将无缝地存储垃圾。

是的,它会的。

但是,如果您愿意,可以使用fixed关键字阻止GC移动它。

可以肯定的是,数组对象可以在内存中移动。

但请注意,您无法获取托管引用对象的指针,或者您使用fixed块,它不能被GC内部移动。

如果移动了数组对象,则GC也会修复从变量tab到数组对象的引用,因此您无法查看受GC影响的任何内容。

考虑到您正在使用var这意味着您要在方法中定义它。 您的变量在该方法的上下文中存在很短的时间,并且GC不太可能移动它。

另一方面,GC将移动内存块以减少内存碎片,因此它可能会移动您的变量。 最好的部分,你甚至都不会注意到它,因为它是同一个旧的“标签”。

如果您想确保修改该变量的位置,可以使用“固定”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM