内存中的C#数组大于预期

时间:2013-09-02 00:35:47

标签: c# memory memory-management

使用C#(和Visual Studio 2010),我定义了一个5个bool的结构(没有别的)。然后我创建了一个16515072该结构元素的数组。奇怪的是,ANTS内存分析器显示该阵列占用的内存超过80 MB。

然而,如果完全打包的位应该只占用~10 MB。即使5个bool被打包(由单个字节编码)(我期望),该数组应该只有~16 MB。

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

1 个答案:

答案 0 :(得分:3)

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

如果您想将布尔值打包成位,可以使用单个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等。