使用C#(和Visual Studio 2010),我定义了一个5个bool的结构(没有别的)。然后我创建了一个16515072该结构元素的数组。奇怪的是,ANTS内存分析器显示该阵列占用的内存超过80 MB。
然而,如果完全打包的位应该只占用~10 MB。即使5个bool被打包(由单个字节编码)(我期望),该数组应该只有~16 MB。
如何改进数组的打包以减少它的occypies内存?在优化大型阵列的内存占用时,是否有任何通用的最佳协议?
答案 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的幂 - 0x08
,0x10
,0x20
等。