来自C++;to C#//结构内存优化
@Zbyl我在这个帖子中看到了你的答案() 我非常喜欢Bitvector32方法,但出于优化的目的:如果我有大量大小为8位/12位(小于32位)的结构,该怎么办,无论如何,是否有比Bitvector32更少的方式来实现它,因为这将是一个永远不会被使用的大量内存分配:我将只使用Bitvector32的前8位。 下面是我想在C#中制作的一个结构示例:来自C++;to C#//结构内存优化,c#,c++,C#,C++,@Zbyl我在这个帖子中看到了你的答案() 我非常喜欢Bitvector32方法,但出于优化的目的:如果我有大量大小为8位/12位(小于32位)的结构,该怎么办,无论如何,是否有比Bitvector32更少的方式来实现它,因为这将是一个永远不会被使用的大量内存分配:我将只使用Bitvector32的前8位。 下面是我想在C#中制作的一个结构示例: 首先,我会考虑实际处理的结构的数量。今天配备GB内存的硬件应该能够轻松处理数千个结构,即使每个结构浪费三个字节(1000000个结构将占用4MB的可用
首先,我会考虑实际处理的结构的数量。今天配备GB内存的硬件应该能够轻松处理数千个结构,即使每个结构浪费三个字节(1000000个结构将占用4MB的可用空间,可能大于1000MB)。考虑到这一点,您甚至可以完全不使用位字段,每个字段只有普通字节(但是,您的setter应该检查范围),结果是6个字节而不是4个字节(可能还有两个字节用于对齐问题),但让您更快地访问值(getter),因为不需要位篡改
另一方面:最后的位字段只不过是一种方便的方式,让编译器编写您自己编写的代码。但是,只要稍加练习,自己处理这些位并不是一项太难的任务,请参见您提到的主题(“手工存取器”部分),在内部将所有数据存储在
byte
类型的变量中,并通过位移位和掩蔽访问它。我看到您也优化了字段名。您的意思是什么???@Dmitibdnikov表示您选择了非常短的名称…@AhmedAekBenJemia他表示您应该使用无符号字符阻塞:1代码>而不是无符号字符bl:1;//已阻止/未阻止
。您的程序在内存中保存了多少8位/12位结构?
struct iec_qualif
{
unsigned char var :2;
unsigned char res :2;
unsigned char bl :1; // blocked/not blocked
unsigned char sb :1; // substituted/not substituted
unsigned char nt :1; // not topical/topical
unsigned char iv :1; // valid/invalid
};