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

问题描述 投票:-2回答:1

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

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

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

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

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

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

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

我也知道C#使用即时编译器,仅在首次调用函数时才编译函数。但是,仅此一项是不够的信息。同样,我不知道内存分配和取消分配的工作方式到底如何。

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

c# memory-management garbage-collection
1个回答
0
投票

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

那么它是否为每个函数调用重新分配到新的内存中?

或者C#可以通过重新使用内存来更聪明地做到这一点?

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.