为什么处理Value比使用Reference for Struct更快?

Chr*_*ove 1 c#

它可能不清楚,但是,当我阅读msdn doc并尝试深入理解Struct行为时.

来自msdn

处理堆栈:

这将带来性能提升.

并且:

每当您需要经常使用的类型并且大部分只是一个数据时,结构可能是一个不错的选择.

我不明白因为,我想当我传递一个方法的参数时,"复制值"过程必须比"复制参考"过程慢?

Eri*_*ert 19

传递结构的成本与其大小成正比.如果结构小于引用或与引用相同的大小,则传递其值将与传递引用的成本相同.

如果没有,那你就是对的; 复制结构可能比复制引用更昂贵.这就是为什么设计指南要求保持结构较小的原因.

(请注意,当您在结构上调用方法时,"this"实际上是作为包含结构值的变量引用传递的;这就是您可以编写可变结构的方法.)

使用结构时可能会有性能提升,但正如您正确指出的那样,也存在潜在的性能损失.结构是便宜的(在内存和时间上)分配和廉价解除分配(及时),如果它们很小则便宜复制.在内存和分配时间方面,引用稍微昂贵,解除分配成本更高,复制成本更低.如果你有大量的小结构的 - 说,一百万点结构 - 那么这将是更便宜的分配和释放在一百万结构数组超过一百万引用数组一个点的情况下,百万类.

但是如果结构很大,那么所有额外的复制可能比从更有效的分配和释放中获得的好处更昂贵.在进行性能分析时,您必须全面了解情况; 如果没有经验数据来支持该决定,不要在绩效的基础上做出"结构与类别"决策.

在我们自己的文档和许多书中,有很多关于内存管理如何在C#幕后工作的错误信息.如果你有兴趣了解什么是神话,什么是现实,我建议你阅读我关于这个主题的系列文章.从底部开始:

http://blogs.msdn.com/b/ericlippert/archive/tags/memory+management/

  • @ChristopheDebove:理论上可以有一个引用大小不同的内存管理系统。(事实上​​,在 Windows 3.1 中,您可以拥有不同大小的指针,具体取决于它们是“近”指针还是“远”指针,这非常令人困惑。)在现代体系结构中,引用的大小完全相同,它们是机器的“本机字大小”——当前硬件上的 32 位或 64 位。 (2认同)