[英]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.