【问题标题】:Is an array of length 1 the same size as a single variable of the same type? [duplicate]长度为 1 的数组是否与同一类型的单个变量大小相同? [复制]
【发布时间】:2014-05-28 14:38:51
【问题描述】:

相当基本的问题,想象一下

int a = 5;
int[] b = new int[1];
b[0] = 5;

ab 是否占用相同的内存空间?我假设ba 大,因为它必须将自身的长度存储在某个地方,所以我认为它会比IntPtr.Size 更大,但我不确定。

我正在尝试编写代码,其中数组的长度在运行时确定,并且可以是 1 或更大 (

我知道a 是值类型,而b 是引用类型。

【问题讨论】:

  • 您希望通过将其设为特殊情况获得什么?您将有更多的代码需要维护和调试,并且所用内存的改进幅度不会太大。
  • @Rawling 你怎么这么快就找到那些重复的?该标题根本不是描述性的
  • 在这种情况下,我用 Google 搜索了 clr array size memory。我知道这不是完全相同的问题,但这也应该回答你的问题:)
  • @Rawling 感谢您的链接。我希望您可以为其他问题添加更多描述性标题,以便人们可以更好地找到它们。
  • 仅仅因为另一个问题可以回答这个问题,并不意味着两个问题是等价的(重复)。

标签: c# arrays


【解决方案1】:

不,ab 不会占用相同数量的内存。

数组容器本身就是一个对象。它必须在某个地方存储与其包含的元素数量有关的数据。所以它将有一个非零大小。

【讨论】:

    【解决方案2】:

    别担心。拥有单个元素和单个值类型的数组将获得的任何东西都可以忽略不计。

    对于您的问题:如您所知,数组是一种引用类型,因此对于 32 位机器,它需要 4 个字节的引用,而对于 64 位机器,它只需要 8 个字节来存储引用。然后是数组中每个项目所需的额外内存。

    所以

    int a = 5; // 4 bytes
    
    int[] array = new int[1]; //4 bytes or 8 bytes for reference (for 32 bit/64bit)
                              //4 bytes for `int` element.
    

    【讨论】:

    • 我确实有超过 1000 万个这样的阵列,所以这对我来说很重要。如果我能节省一千万IntPtr.Size,那是值得的。
    • 如果对象是长期存在的,那将减少 40MB 的内存使用,或者如果它们是短期对象(在第 0 代 GC 传递时收集)则无关紧要。只有在内存非常有限的设备上才有意义,例如手机或嵌入式设备。
    • @Moop,在这种情况下,现在您知道数组引用仅用于引用就需要额外的 4/8 字节内存。
    【解决方案3】:

    a 是一个 32 位整数。它将占用 32 位。

    b是引用类型,会占用一个字的内存。在 32 位系统上,它是 32 位。在 64 位的 64 位系统上。

    当然,使用数组会导致内存在分配给b 本身的空间之外被消耗,即b 变量引用的实际数组内存,但是当比较ab 作为不相关的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-03
      • 2014-07-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多