我想在Rust的“位级别”上创建一个新的数据类型。
例如,四精度浮点数。我可以创建一个具有两个 double 浮点数的结构,并通过将四边形拆分为两个 double 数来任意提高精度,但是我不想这样做(这就是我在“位级”上的意思)。
我曾考虑过使用u8
-array或bool
-array,但是在两种情况下,我都浪费了7位内存(因为bool
也大了一个字节)。我知道有几种crates实现了位数组或位向量之类的东西,但是查看它们的源代码并不能帮助我理解它们的实现。
如何在不浪费内存的情况下创建这样的位数组,这是实现四精度类型之类的时候我想选择的方式吗?
我不知道如何实现不使用基本类型或组合了基本类型的结构的新数据类型,而且我还无法在Internet上找到解决方案。也许我搜索的关键词不正确。
最佳答案
您所提出的问题没有直接答案:与其他任何编程语言一样,Rust具有用于类型布局的一组基本规则。这是由于以下事实:(大多数)现实世界中的CPU无法寻址单个位,在引用内存时需要某些对齐方式,具有有关指针算术工作方式的规则等。
例如,如果创建的类型只有两位,则仍然需要8位字节来表示该类型,因为在大多数CPU的操作码上根本无法寻址两位。也没有办法采用这种类型的地址,因为寻址至少在字节级别上有效。有关此问题的更多有用信息,请参见here,第2节,The Anatomy of a Type
。请注意,您正在考虑的非浪费位级类型需要满足此处提到的所有规则。
这是表示您想要做的事情的一种非常合理的方法,例如要么作为一个单独的u128
包装,然后在该类型的顶部实现所有算法。另一种更通用的方法是使用Vec<u8>
。您将总是做相对大量的位屏蔽,间接操作等。
看看 rust_decimal
或类似的箱子可能也是一个好主意。
关于struct - 您如何在 “bit-level”上创建一个全新的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59620041/