C#GC是否可以移动内存对象

时间:2019-07-04 08:06:34

标签: c#

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

var tab = new int[10];

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

我的问题是:在我的程序执行过程中,“ tab”地址是否有可能改变?

我只想了解。

实际上,无论制表符值是否更改。

4 个答案:

答案 0 :(得分:8)

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

要点是,在C#中,由于它是一种托管语言,因此无需理会内存地址。对tab变量的所有引用都会相应地更改,并且您的程序将在垃圾回收过程中无缝运行。

答案 1 :(得分:8)

是的。

但是您可以根据需要使用fixed关键字来阻止GC移动。

答案 2 :(得分:2)

确定数组对象可以在内存中移动。

但是请注意,您无法获取托管引用对象的指针,或者使用fixed块,GC无法在其中移动它。

如果移动了数组对象,则GC也固定了从变量tab到数组对象的引用,因此您将无法看到受GC影响的任何东西。

答案 3 :(得分:1)

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

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

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