您如何在 "bit-level" 上创建一个全新的数据类型?
How do you approach creating a complete new datatype on the "bit-level"?
我想在 "bit-level" 上用 Rust 创建一个新的数据类型。
例如,四精度浮点数。我可以创建一个具有两个双精度浮点数的结构,并通过将四边形拆分为两个双精度数来任意提高精度,但我不想这样做(这就是我在 "bit-level" 上的意思)。
我考虑过使用 u8
数组或 bool
数组,但在这两种情况下,我都浪费了 7 位内存(因为 bool
也是一个字节大) .我知道有几个 crates 实现了位数组或位向量之类的东西,但是查看它们的源代码并没有帮助我理解它们的实现。
如何在不浪费内存的情况下创建这样的位数组,这是我在实现四精度类型时想要选择的方式吗?
我不知道如何实现不使用基本类型的新数据类型或者是结合基本类型的结构,我在网上也没有找到解决方案;也许我没有使用正确的关键字进行搜索。
你问的问题没有直接答案:就像任何其他编程语言一样,Rust 有一套基本的类型布局规则。这是因为(大多数)现实世界 CPUs 无法寻址单个位,在引用内存时需要某些对齐方式,有关于指针算法如何工作等的规则等
例如,如果您创建一个只有两位的类型,您仍然需要一个 8 位字节来表示该类型,因为在大多数 CPU的操作码;也没有办法获取这种类型的地址,因为寻址至少在字节级别起作用。有关此的更多有用信息,请参见 here,第 2 节,The Anatomy of a Type
。请注意,您正在考虑的非浪费位级类型需要满足此处提到的所有规则。
这是一种非常合理的方法来表示你想做什么,例如作为一个单独的,包装的 u128
并在该类型之上实现所有算术。另一种更通用的方法是使用 Vec<u8>
。你总是会做大量的位掩码、间接等。
看看 rust_decimal
或类似的箱子可能也是个好主意。
我想在 "bit-level" 上用 Rust 创建一个新的数据类型。
例如,四精度浮点数。我可以创建一个具有两个双精度浮点数的结构,并通过将四边形拆分为两个双精度数来任意提高精度,但我不想这样做(这就是我在 "bit-level" 上的意思)。
我考虑过使用 u8
数组或 bool
数组,但在这两种情况下,我都浪费了 7 位内存(因为 bool
也是一个字节大) .我知道有几个 crates 实现了位数组或位向量之类的东西,但是查看它们的源代码并没有帮助我理解它们的实现。
如何在不浪费内存的情况下创建这样的位数组,这是我在实现四精度类型时想要选择的方式吗?
我不知道如何实现不使用基本类型的新数据类型或者是结合基本类型的结构,我在网上也没有找到解决方案;也许我没有使用正确的关键字进行搜索。
你问的问题没有直接答案:就像任何其他编程语言一样,Rust 有一套基本的类型布局规则。这是因为(大多数)现实世界 CPUs 无法寻址单个位,在引用内存时需要某些对齐方式,有关于指针算法如何工作等的规则等
例如,如果您创建一个只有两位的类型,您仍然需要一个 8 位字节来表示该类型,因为在大多数 CPU的操作码;也没有办法获取这种类型的地址,因为寻址至少在字节级别起作用。有关此的更多有用信息,请参见 here,第 2 节,The Anatomy of a Type
。请注意,您正在考虑的非浪费位级类型需要满足此处提到的所有规则。
这是一种非常合理的方法来表示你想做什么,例如作为一个单独的,包装的 u128
并在该类型之上实现所有算术。另一种更通用的方法是使用 Vec<u8>
。你总是会做大量的位掩码、间接等。
看看 rust_decimal
或类似的箱子可能也是个好主意。