![]() |
1
134
你是唯一能决定那个问题答案的人。两种方法都试试, 一个有意义的、以用户为中心的、相关的性能度量,然后您将知道在相关场景中,更改是否对实际用户有意义。 结构消耗更少的堆内存(因为它们是 较小的
也许是类,也许是结构。根据经验:
如果需要对结构的某个字段进行变异,通常最好构建一个构造函数,该构造函数返回一个完整的新结构,并且字段设置正确。可能稍微慢一点(测量一下!)但逻辑上更容易推理。
不 ,它们不一样,因为 堆栈上的对象是集合的根 . 垃圾收集器不需要问“堆栈上的这个东西还活着吗?”因为这个问题的答案总是“是的,在堆栈上”。(现在,你不能指望 保持 但是垃圾收集员 做 必须将堆栈上的对象视为活动对象,就像它将已知的任何活动对象视为活动对象一样。堆栈上的对象可以引用需要保持活动状态的堆分配对象,因此为了确定活动集,GC必须将堆栈对象视为活动的堆分配对象。但很明显 不 为了压缩堆而被视为“活动对象”,因为它们本来就不在堆上。
|
![]() |
2
23
有时
例子:
大约比
另一方面是项目需要移动或选择值类型所有的复制将减慢你的速度。为了得到准确的答案,我怀疑你必须分析你的代码并测试它。 |
![]() |
3
7
结构可能看起来类似于类,但有一些重要的区别需要注意。首先,类是引用类型,结构是值类型。通过使用结构,您可以创建行为类似于内置类型的对象,并享受它们的好处。 当调用类的新运算符时,它将被分配到堆中。但是,当您实例化一个结构时,它会在堆栈上创建。这将带来业绩增长。此外,您不会像处理类那样处理对结构实例的引用。您将直接使用struct实例。因此,在将结构传递给方法时,它是按值传递的,而不是作为引用传递的。 更多信息: http://msdn.microsoft.com/en-us/library/aa288471(VS.71).aspx |
![]() |
4
6
在这种情况下,当你把它们放在
(不过,请注意,大型数组将在大型对象堆上找到它们的路径,如果它们的生存期很长,可能会对进程的内存管理产生不利影响。记住,记忆并不是唯一的考虑。) |
![]() |
5
4
如果它们有值语义,那么您可能应该使用结构。如果它们有引用语义,那么您可能应该使用一个类。有一些例外,它们大多倾向于创建一个类,即使存在值语义,但从那里开始。 至于第二次编辑,GC只处理堆,但是堆空间比堆栈空间大得多,所以把东西放在堆栈上并不总是成功的。除此之外,结构类型列表和类类型列表都将位于堆中,因此在本例中这与此无关。 编辑: 我开始考虑这个学期 邪恶的 有害的。毕竟,如果类不是主动需要的,那么使其可变是一个坏主意,而且我不排除使用可变结构的可能性。这是一个很糟糕的想法,以至于几乎总是一个坏主意,但大多数情况下,它只是不符合值语义,所以在给定的情况下使用结构是没有意义的。 私有嵌套结构可能有合理的例外,在这种情况下,该结构的所有使用都被限制在非常有限的范围内。但这不适用于这里。 实际上,我认为“它会变异,所以它是一个糟糕的缺陷”并不比继续讨论堆和堆栈要好多少(这至少对性能有一些影响,即使经常被误传)。”它变异了,所以 很可能 认为它具有值语义是没有意义的,所以它是一个糟糕的结构“只是略有不同,但重要的是,我认为。 |
![]() |
6
3
最好的解决办法是测量,再测量,然后再测量一些。可能有一些你正在做的事情的细节可能会使一个简单、容易的答案变得困难,比如“使用结构”或“使用类”。 |
![]() |
7
3
一个结构,在其核心,只不过是一个字段的集合。在.NET中,结构可以“假装”为对象,并且对于每种结构类型,.NET都隐式定义一个具有相同字段和方法的堆对象类型,这些字段和方法作为堆对象的行为将类似于对象。持有对此类堆对象的引用的变量(“装箱”结构)将显示引用语义,但直接持有结构的变量只是变量的聚合。
我认为结构和类之间的混淆很大程度上源于结构有两个非常不同的用例,这两个用例应该有非常不同的设计准则,但是MS准则没有区分它们。有时需要一些行为类似对象的东西;在这种情况下,MS准则是相当合理的,尽管“16字节限制”可能更像24-32。然而,有时需要的是变量的聚合。用于此目的的结构应该只包含一堆公共字段,并且可能包含
例如,如果变量聚合结构具有成员
有时需要考虑的一个有用的模式是
如果一个人有
另一个注意事项:如果要存储大量类似的内容,最好将它们存储在可能嵌套的结构数组中,最好将每个数组的大小保持在1K到64K左右。结构数组是特殊的,在索引中可以直接引用内部的结构,因此可以说“a[12].x=5;”。尽管可以定义类似数组的对象,但C不允许它们与数组共享这种语法。 |
![]() |
8
1
使用类。
|
![]() |
9
1
从c++的角度来看,我同意修改structs属性比修改类慢。但我确实认为,由于结构是在堆栈上而不是堆上分配的,因此它们的读取速度会更快。从堆中读取数据需要比从堆栈中读取更多的检查。 |
![]() |
10
1
好吧,如果你最终使用struct,那么去掉string并使用固定大小的char或byte缓冲区。 那是表演。 |
![]() |
A B · C#Excel自动调整列避免长文本时出错 6 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 6 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 6 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 7 月前 |