C#函数重复调用,是否每个变量都被取消分配并一次又一次地分配?

时间:2019-10-23 21:19:28

标签: c# memory-management garbage-collection

我正在使用C#制作以60 fps运行的游戏。我的某些绘图代码具有嵌套的循环,可以在整个板上寻找某些动作。

其中一些函数声明了许多局部变量,包括基元和对象列表。我担心它们的内存分配一遍又一遍。

当函数结束时,它的所有局部变量都应该“消失”。但是,当再次调用该函数时,所有这些局部变量都需要返回。

那么对于每个函数调用,它都会重新分配到新的内存中吗?还是C#通过重用内存可以更聪明地做到这一点?我担心内存分配的开销,特别是当我列出大量对象时。某些代码在绘制函数中每秒调用60次。

我认为我不能使这些功能静态化。它们需要属于一个实例,并且会有很多实例调用它们。

我尝试将局部变量设为静态,但是C#似乎不允许这样做。

我也知道C#使用垃圾回收器,但是仅知道这一点并不能回答我的问题。我不知道内存分配和取消分配在其中如何工作。我最担心的是,在gc出现之前,未使用的内存迅速膨胀,发现没有指针指向它,然后将其删除。

我还知道C#使用即时编译器,其中的函数仅在首次调用时才编译。但是仅此一项是不够的信息。同样,我不知道内存分配和取消分配的工作原理是什么。

如果最糟糕的是,我可以为仅在那些函数中使用的类创建全局变量。这样,我将确保不会快速重复声明和删除变量。但是,我希望有人能为我提供一些有关C#到底如何工作的见解,也许会有更好的方法。也许由于某种原因它并不是什么大问题,有人可以解释原因。

1 个答案:

答案 0 :(得分:1)

首先,让我们看看您提出的两个具体问题。

  

那么对于每个函数调用,它是否都会重新分配到新的内存中?

是的

  

还是C#可以通过重新使用内存来更巧妙地做到这一点?

内存被重用,但是只有在被垃圾回收之后才被重用。而且您不知道什么时候发生,因为它通常是不确定的。公共语言运行时(CLR)持续平衡两个优先级:不通过延迟垃圾回收来让应用程序的工作集变得太大,以及不让垃圾回收运行得太频繁。

我通常不会担心内存开销,因为它会为您处理。一个更有趣的问题是垃圾回收频繁发生对性能的潜在影响。在这里,您需要从性能预算入手,并使用探查器来识别和诊断任何相关的性能问题。

您可以使用Performance counters详细了解应用程序的内存和性能特征。