2

使用 C#(和 Visual Studio 2010),我定义了一个由 5 个布尔值组成的结构(仅此而已)。然后我创建了该结构的 16515072 个元素的数组。奇怪的是,ANTS 内存分析器显示该数组占用了超过 80 MB 的内存。

但是,如果完美打包的位应仅占用约 10 MB。即使 5 个布尔值被打包(编码)为单个字节(我希望如此),该数组也应该只有 ~16 MB。

如何改进数组的打包以减少它占用的内存?在优化大型阵列的内存占用时,是否有任何一般的最佳方案?

4

1 回答 1

3

您得到的结果是正确的:在 C# .NETbool没有打包 - 每个占用一个字节,因此总数为 16515072*5=82MB。

如果您想将布尔值打包成位,您可以使用单个byte来存储值,并为您的 getter 和 setter 使用位操作:

private byte storage;
public bool Property1 {
    get {
        return (storage & 0x01) != 0;
    }
    set {
        if (value) {
            storage |= 0x01;
        } else {
            storage &= 0xFE;
        }
    }
}
public bool Property2 {
    get {
        return (storage & 0x02) != 0;
    }
    set {
        if (value) {
            storage |= 0x02;
        } else {
            storage &= 0xFD;
        }
    }
}
public bool Property3 {
    get {
        return (storage & 0x04) != 0;
    }
    set {
        if (value) {
            storage |= 0x04;
        } else {
            storage &= 0xFB;
        }
    }
}

继续对其余属性的位掩码使用 2 的幂 - 0x080x100x20等。

于 2013-09-02T00:38:09.807 回答