【问题标题】:Do arrays within C# struct defeat the performance benefits?C# 结构中的数组是否会破坏性能优势?
【发布时间】:2012-06-27 01:32:33
【问题描述】:

据推测,C# 结构相对于轻量级数据对象的类具有一些性能优势,因为它们完全存储在堆栈上,而不是分配堆内存。

如果该结构的成员之一是 int[] 或结构数组,那么这对分配有什么影响以及我可能从中获得的任何其他性能优势?

例子:

struct A
{
    int foo;
    int bar;
}

struct B
{
   int[] foos;
   A[] bars;
}

结构 A 与结构 B 在性能、内存使用等方面有何不同?

【问题讨论】:

  • “据说 C# 结构比轻量级数据对象的类有一些性能优势,因为它们完全存储在堆栈上,而不是分配堆内存。” - 是的,在某些情况下在这种情况下,值类型语义更可取。在担心您的问题之前,我会先阅读值类型与引用类型。一旦你这样做了,你将能够自己回答这个问题:)
  • @Ed S. 我有一个不错的理解,并有一个初步的答案。我只是把它放在那里,看看我在研究中是否遗漏了什么。
  • @CodeFusionMobile:好的,但是这里有很多重要的细节。例如,在托管堆上分配的类型的结构成员实际上仍然在堆上分配。如果你还没有读过这篇文章,a good read on the subject here

标签: c# performance optimization


【解决方案1】:

由于大小不是类型的一部分,因此必须动态分配数组。所以你的结构只包含一个指向数组的指针。

结构本身是堆栈分配的*,但数组内容仍在堆上。

*通常。在某些情况下,值类型是堆分配的,例如作为匿名方法中使用的外部变量。当然,如果它是堆分配的对象的一部分,则结构会在堆上内联分配。可能还有其他一些极端情况,但这并不重要。

【讨论】:

  • “结构本身是堆栈分配的”——这里要小心。这不是(总是)正确的,并且可能会从这里的学究(包括我)那里获得一些肮脏的目光。
  • 另外值得注意的是,结构的初始状态包含两个空引用。
  • @Kirk 对不起,我只是通过Microsoft's site 当你在一个类上调用 New 运算符时,它将在堆上分配。但是,当您实例化一个结构时,它会在堆栈上创建。
  • @Antimony,没那么简单;正如 Ed 上面提到的,请查看 this article by Eric Lippert。读起来很有趣,并且深入探讨了这个话题。
【解决方案2】:

结构中的数组不会破坏结构的堆栈与堆分配带来的性能优势。如果你真的有好处;)。创建数组实例时,结构中的数组将在堆上分配。

【讨论】:

    猜你喜欢
    • 2017-02-07
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2017-12-26
    • 2011-03-16
    • 2019-08-03
    • 1970-01-01
    • 2014-12-19
    相关资源
    最近更新 更多