MSDN 说 16 字节或更少的类最好作为结构体处理 [引文].
这是为什么?
这是否意味着如果结构体超过 16 个字节,它的效率就低于类,还是相同?
如何确定您的类是否低于 16 字节?
是什么限制了结构体像类一样运行?(除了不允许无参数构造函数)

有帮助吗?

解决方案

这个问题有几个不同的答案,而且有点主观,但我能想到的一些原因是:

  • 结构是值类型,类是引用类型。如果您使用 16 个字节作为总存储空间,则可能不值得为每个字节创建内存引用(4 到 8 个字节)。
  • 当您有非常小的对象时,通常可以将它们推送到 IL 堆栈上,而不是对对象的引用。这确实可以加快某些代码的速度,因为您消除了被调用方的内存取消引用。
  • IL 中存在一些与类相关的额外“绒毛”,如果您的数据结构非常小,则无论如何都不会使用这些绒毛,因此它只是您不需要的额外垃圾。

然而,结构和类之间最重要的区别是结构是值类型,而类是引用类型。

其他提示

所谓“有效”,他们很可能谈论的存储器所花费的表示的类或结构的量。

在32位平台,分配一个对象最少需要16个字节。在64位的平台,最小对象大小是24个字节。所以,如果你单纯从内存使用量看它,它包含小于16个字节的数据结构会比对应的类“更好”。

但是,存储器的使用量是不是整个故事。值类型(结构)比参考类型(类)根本不同。结构可能是不方便的工作,并且实际上可以导致性能问题,如果你不小心。

真正的答案,当然,是在你的情况下使用哪个效果最好。在大多数情况下,你会好得多使用类。

检查这个环节,我发现它的答案之一,所以今天:。网式内幕。还可以尝试搜索SO和谷歌搜索“引用类型VS值类型”结构和类之间的差异。

  
    

有什么限制从像个类结构?

  

有许多不同之处。不能从一个结构继承,例如

您不能有虚方法,所以你不能用一个结构来实现一个接口。在结构实例方法可以访问结构的私人领域,但除此之外,他们的行为很像auxilirary“辅助”功能(不可变的结构,他们有时甚至不需要访问私人数据)。所以我觉得他们是不是附近的“珍贵”的类方法。

这是由于,该CLR处理结构和类的不同的方式。结构是值类型,这意味着他们生活在栈上,而不是在托管堆中。这是一个好的经验法则,以保持结构小,因为一旦你开始将它们作为作为结构都以完整的传递给方法时,拷贝你会招致开销方法的参数。

由于类通过他们的参考的副本的方法作为方法的参数使用时招致更少的开销。

,以确定你的类的大小,最好的方法是,至总量由你的类的所有成员加上CLR开销东西一个额外的8个字节(同步块索引和参照的类型所需要的字节数宾语)。

结构是从类不同的,因为它们被存储在堆栈中,而不是在堆上。这意味着,每一次与您通话的结构作为参数的方法,创建一个副本,并传递给方法。这就是为什么大的结构是非常低效的。

我将积极鼓励对仍然使用结构,因为这可能会导致一些微妙的错误:如当改变一个结构的一个字段,其不会被反射的呼叫者(因为你只改变了复制) - 其是完全不同的行为,以类

因此,16个字节,我认为是一个结构合理的最大尺寸,但仍然在大多数情况下,最好是有一个类。如果你仍然想创建一个结构,尽量做到一成不变至少。

在存储器中,struct将直接持有的数据,而一个类将更像一个指针。这本身就提出了一个重要的区别,因为使所述结构作为参数的方法将通过其的值(复制它们在栈上),而类将通过参考值。如果结构是很大的,你将被复制在每个方法调用了很多价值。当它是非常小的值复制和使用它们直接将可能不是复制指针,并且具有从另一个地方抓住他们更快。

关于限制:你不能将它设置为null(虽然你可以使用可空<>),你必须初始化它的时候了。

复制结构的实例花费较少的时间比从一个旧创建类和复制数据的一个新实例,但类实例可以共享和struct实例不能。因此,“structvar1 = structvar2”需要复制新结构实例,而“classvar1 = classvar2”允许classvar1和classvar2指代相同的结构实例(而无需创建一个新的)。

来处理新的结构实例的创建的代码为尺寸多达16个字节优化。较大的结构较少有效地处理。结构是在案件的胜利,每一个持有结构体变量将举行一个独立的实例(即没有理由期望任何特定的两个变量将持有相同的情况下);他们是没有太大的胜利(如果他们赢的话)的情况下,许多变量可以持有相同的实例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top