此特定情况的结构或类
本文关键字:结构 情况 | 更新日期: 2023-09-27 18:33:05
以我现在拥有的所有知识,我无法决定我应该将哪个用于我的用例。
现在这是结构的示例。
第一个类如下所示:
class Owner
{
public A[] Kids;
public Owner(int count)
{
Kids = new A [count];
// If I would use classes I would need to create new class for each item, right?
// It would look like below and my worries are memory impacts because of new A()
// for(int i = 0; i < count; Kids[i++] = new A());
}
}
第二个类如下所示:
class Node
{
private Owner o;
private int num;
private A[] kids;
public Node(Owner o, int num)
{
this.o = o;
this.num = num;
}
public A[] Kids
{
get
{
this.kids = o.Kids[num].NextList;
return this.kids;
}
}
}
类型 A 看起来像这样
<struct or class> A
{
public int Value;
public A[] NextList;
}
现在的问题是,当使用结构时,访问的运行速度会比使用类时更快吗?
使用类时我是否会获得内存开销,因为我需要启动每个类。
使用类时是否需要注意杀死引用?
在这种情况下,你会使用哪个人?
如果这是重复的或我做错了什么,我深表歉意。在降级问题之前,请告诉我我做错了什么。我还是这个论坛的新手。
TL;DR:使用一个类。
由于您使用的是数组并且担心内存,因此需要记住一件事:
如果您有一个结构数组,则为该数组分配的总字节数将sizeof(your struct) * number of elements
如果您有一个类数组,则为数组分配的总字节数将sizeof(reference) * number of elements
(其中引用的大小为 x86 的 32 位和 x64 的 64 位(。
在某些情况下,这可能会产生很大的不同。
如果数组的总大小超过 85,000 字节,则它将被放置在大型对象堆中。否则,它会在正常堆上。这可能意味着使用结构将导致某些数组超过 85,000 字节阈值,而如果您改用类,它们将无法达到该阈值。
大型对象堆上的项目在垃圾回收 (*( 期间不会压缩,因此,如果大型对象过多,则可能会出现内存碎片问题。
请注意,这也适用于许多其他集合(例如 List<T>
(,因为它们在实现中使用数组。
在大多数情况下,使用类而不是结构的开销可以忽略不计,如果您认为代码会导致问题,无论如何,您应该检测代码以确保它。
因此,您通常应该只使用一个类。
还有一件事需要注意:
如果您有结构列表,则如果不将整个元素替换为更新的元素,则无法更改列表中各个元素的属性。
所以这是不可能的:
List<MyStruct> list = new List<MyStruct>();
... init list
list[0].Value = 1; // Compile error for structs, no error for classes.
不过,这应该不是问题 - 因为你的结构总是不可变的,所以你不会首先尝试这样做,对吧? ;)
.Net 4.51 引入了一种允许下一个垃圾回收移动大型对象的方法,但这必须以编程方式启动。
http://blogs.msdn.com/b/mariohewardt/archive/2013/06/26/no-more-memory-fragmentation-on-the-large-object-heap.aspx