创建值类型时会发生什么?

Bob*_*Bob 15 c#

我正在开发一个使用XNA和C#的游戏,并且试图避免new struct()每帧调用类型代码,因为我认为它会让GC失败."但是等等,"我对自己说,"结构是一种价值类型.那时GC不应该被调用,对吧?" 嗯,这就是我在这里问的原因.

我对价值类型的变化只有一个非常模糊的概念.如果我在函数调用中创建一个新结构,是否在堆栈上创建了结构?它是否会被推动和弹出,性能不受打击?此外,如果我需要在一次调用中创建多个实例,是否会有一些内存限制或性能影响?

举个例子,这个代码:

spriteBatch.Draw(tex, new Rectangle(x, y, width, height), Color.White);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Rectangle是一个结构.创建新Rectangle时会发生什么?多次重复该行(比如几千次)会有什么影响?是否创建了这个Rectangle,将一个副本发送到Draw方法,然后丢弃(意味着没有内存被吃掉,在同一个函数中以这种方式调用Draw)?

PS我知道这可能是预先成熟的优化,但我很好奇并希望更好地了解正在发生的事情.

the*_*oop 4

当创建一个新结构时,它的内容会直接放入您指定的位置 - 如果它是一个方法变量,它会进入堆栈;如果它被分配给一个类变量,它就会进入所指向的类实例(在堆上)。

当复制结构变量(或者,在您的情况下,传递给函数)时,组成结构的字节都会被复制到堆栈上或类内部的正确位置(如果您要设置字段或属性)引用类型的实例)。

即使可能存在字节复制,JIT 编译器也可能会优化所有不必要的副本,以便尽可能快地执行。一般来说,这不是你需要担心的事情 - 这很大程度上是一个微观优化:)

这回答了你的问题了吗?