【问题标题】:Memory-limit for struct [duplicate]结构的内存限制[重复]
【发布时间】:2016-03-08 12:26:30
【问题描述】:

On MSDN我读到这个:

避免定义结构,除非该类型具有以下所有特征:[...] 它的实例大小小于 16 字节。

基于this post by Jon Skeet,我得出的结论是,字符串的内存使用量至少为 20 字节。

所以我想知道创建一个带有字符串成员的结构是否被认为是一件好事。我知道 MSDN 上提到的文章指出“避免”而不是“你不能”。话虽如此,我不确定为什么要提出这个 16 字节的限制

【问题讨论】:

  • String 是一个引用类型。在谈到 struct 实例大小时,无论其大小如何,任何引用都将占用 4 或 8 个字节,具体取决于架构。
  • 我猜这个副本并不重要,因为根本不关心内存。重复的句柄只有速度

标签: c# memory struct


【解决方案1】:

字符串数据不在结构内部。该结构只存储一个 8 字节的对象引用(如果是 64 位)。

此限制是一种简单的性能启发式。大结构的复制成本很高。如果在您的情况下复制不是问题,您可以完全忽略该建议。

例如,如果您主要使用此类结构的大数组并通过引用访问数组元素,则无需复制。当你说bigArray[i].x++ 时,这直接修改了x


主观说明:

我也不喜欢你引用的那种笼统的概括。我发现更详细地了解性能特征可以让您完全摒弃这些简单的规则。但这不是这个问题的重点。

【讨论】:

  • 完整的引号以结尾不仅仅是当务之急。所以概括一下可能没问题。
  • @xanatos 正如您在我的最后一段中看到的那样,我也提到了这一点,这就是为什么我什至想知道他们添加此限制的原因。
  • 我认为bigArray[i].x++ 甚至不会为结构编译。
  • @HimBromBeere 数组有特殊处理......它的工作原理:ideone.com/sX2CEF(用于x 字段和x 属性)
  • @HimBromBeere 不,数组由运行时直接处理。 [x] 索引器是 IL 语言的“本机”。 List<T> 没有这种奢侈,它的索引器是通过方法在 IL 级别构建的(Item 索引器方法)
猜你喜欢
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2015-08-02
  • 2017-03-23
相关资源
最近更新 更多