让我们假设这个非常基本的C#代码:
var tab = new int[10];
我已经阅读到非固定变量可以通过垃圾回收器在内存中移动。
我的问题是:在我的程序执行过程中,“ tab”地址是否有可能改变?
我只想了解。
实际上,无论制表符值是否更改。
答案 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将移动内存块以减少内存碎片,因此,它可能会移动您的变量。最好的部分是您甚至不会注意到它,因为它对您来说是相同的旧“标签”。
如果您想确定要固定该变量的位置,可以使用“固定”。