Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存中的C#数组大于预期值_C#_Memory_Memory Management - Fatal编程技术网

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

内存中的C#数组大于预期值,c#,memory,memory-management,C#,Memory,Memory Management,使用C#(和VisualStudio2010),我定义了一个由5个布尔组成的结构(没有其他东西)。然后我创建了该结构的16515072个元素的数组。奇怪的是,ANTS内存分析器显示该阵列占用了超过80MB的内存 但是,如果数据位完全压缩,它应该只占用~10 MB。即使5个bool被压缩到(由)一个字节中(我希望是这样),数组也应该只有~16MB 如何改进阵列的打包以减少其占用的内存?在优化大型阵列的内存占用时,有什么通用的最佳方案吗?您得到的结果是正确的:在C#.NETbools中,没有压缩—每

使用C#(和VisualStudio2010),我定义了一个由5个布尔组成的结构(没有其他东西)。然后我创建了该结构的16515072个元素的数组。奇怪的是,ANTS内存分析器显示该阵列占用了超过80MB的内存

但是,如果数据位完全压缩,它应该只占用~10 MB。即使5个bool被压缩到(由)一个字节中(我希望是这样),数组也应该只有~16MB


如何改进阵列的打包以减少其占用的内存?在优化大型阵列的内存占用时,有什么通用的最佳方案吗?

您得到的结果是正确的:在C#.NET
bool
s中,没有压缩—每个都占用一个字节,因此总数为16515072*5=82MB

如果您想将布尔值打包为位,可以使用单个
字节
存储值,并对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
,等等。

每个
bool
都取一个单独的字节。没有自动打包优化。每个
bool
占用一个字节,因此总内存为5*16515072 B=82575360 B=82 MB谢谢,我没有意识到这一点。我希望这个结构是自动打包的(这不是C++中的情况吗?)有人可以对dasblinkenlight建议的打包代码的性能发表评论吗?这不是比使用结构更快,因为将比特转换成字节(和返回)似乎比访问字节中的单个比特更有效(因为两者的效率取决于编译器)?@ PADYARS C++和C ^除了一些语法和名称中的“C”之外没有任何共同点。任何代码的性能都很好,除非它在现实生活中成为瓶颈。@pad_ares我不认为C/C++默认使用位打包(尽管该语言提供了打包位的工具,如果您愿意的话)。由于字节是内存中最小的可寻址单元,因此打包必然会使用与我建议的类似的代码,可能会在可用的情况下使用更具体的CPU指令。
ubyte
?不是用C。我想你的意思是
byte
@pad\u ares我在编辑中硬编码了反转结果以避免这个错误。