使用 C#(和 Visual Studio 2010),我定义了一个由 5 个布尔值组成的结构(仅此而已)。然后我创建了该结构的 16515072 个元素的数组。奇怪的是,ANTS 内存分析器显示该数组占用了超过 80 MB 的内存。
但是,如果完美打包的位应仅占用约 10 MB。即使 5 个布尔值被打包(编码)为单个字节(我希望如此),该数组也应该只有 ~16 MB。
如何改进数组的打包以减少它占用的内存?在优化大型阵列的内存占用时,是否有任何一般的最佳方案?
使用 C#(和 Visual Studio 2010),我定义了一个由 5 个布尔值组成的结构(仅此而已)。然后我创建了该结构的 16515072 个元素的数组。奇怪的是,ANTS 内存分析器显示该数组占用了超过 80 MB 的内存。
但是,如果完美打包的位应仅占用约 10 MB。即使 5 个布尔值被打包(编码)为单个字节(我希望如此),该数组也应该只有 ~16 MB。
如何改进数组的打包以减少它占用的内存?在优化大型阵列的内存占用时,是否有任何一般的最佳方案?
您得到的结果是正确的:在 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 的幂 - 0x08
、0x10
、0x20
等。