【问题标题】:Why struct takes more memory in array then sum of it's fields [duplicate]为什么结构在数组中占用更多内存然后是其字段的总和[重复]
【发布时间】:2019-12-03 13:19:25
【问题描述】:

我有这个简单的结构,它的字段总和 = 10 位

public struct TestSTrut
{
    public byte ByteField;
    public bool BoolFieldOne;
    public bool BoolFieldTwo;

    public TestSTrut(byte a, bool b, bool c)
    {

        ByteField= a;
        BoolFieldOne= b;
        BoolFieldTwo= c;
    }

}

现在,如果我将其中的 1000 个放入数组中,则数组的大小为 3012 字节,这意味着每个结构为 3 字节?但应该是 1250 字节? (10*1000) / 9.

如果我将 1000 个字节放在一个数组中进行比较,它的大小为 1012 个字节(12 个字节用于数组开销)。

我正在使用 Visual Studio 在 x64 的调试中对此进行测试

【问题讨论】:

  • 如何安排 1 位内存?
  • @vasily.sib 两个布尔字段可以打包成一个字节(但不是)。
  • 结构中字段的最小大小是一个字节而不是位 - 所以结构大小是 3 个字节。
  • struct alignemnt 将是 1 字节(所以 8 位),现在 8 位将占用 8 位,然后 bool 将在第 9 位写入,因为不需要 alignemnt,下一位需要alignet,所以会有 7 位偏移,并且在第 17 位将写入另一个布尔值。它将与 24 位对齐,并添加另外 7 个空位偏移量。给出 3 个字节的大小。

标签: c#


【解决方案1】:

简单的答案:

sizeof(bool) == 1

如果您需要更紧凑的存储,则需要自己编写。

【讨论】:

  • @Sinatr 是的,但这已经意味着您需要一些逻辑来处理数组 - 使用一个结构数组,每个结构都有自己的 BitArray 可能比拥有这两个布尔值更糟糕。所以你可能会有类似“bool1 的 BitArray,bool2 的 BitArray,字节的数组”之类的东西。但这完全取决于 OP 想要做什么——他似乎没有需要解决的问题,只是有点好奇。
  • 我不知道哇,但是为什么?真是太难忘了:(
  • @IronHide 权衡。在每位级别上使用内存是相当昂贵的。如今,内存比 CPU 时间(和内存访问时间)更便宜且更容易扩展,因此除非您有充分的理由不这样做,否则您希望保持简单。这意味着内存对齐和其他相关的事情。有些语言会为您打包(尽管整个结构仍将四舍五入到最接近的整数大小 - 所以在您的情况下,它将是 2 个字节而不是 3 个字节;除非它无论如何都对齐到 4 个字节或 8 个字节:P),C# 没有。
  • @IronHide 最后,如果您需要与其他数据相比有很多布尔值,那么无论如何您都需要更详细地考虑您的设计。您希望非常明确地说明如何处理布尔值。您可能想要使用位数组或标志枚举,或任何数量的其他解决方案。 C# 只是不会试图猜测你:)
猜你喜欢
  • 2014-04-25
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2020-10-21
  • 2018-08-02
  • 2019-03-27
相关资源
最近更新 更多