【发布时间】:2020-09-10 10:08:16
【问题描述】:
为了好玩,我正在用 Rust 编写一个 bignum 库。我的目标(与大多数 bignum 库一样)是使其尽可能高效。我希望它即使在不寻常的架构上也能高效。
在我看来很直观,CPU 将在具有架构的本机位数的整数上更快地执行算术运算(即,u64 用于 64 位机器,u16 用于 16 位机器等)因此,由于我想创建一个对所有架构都有效的库,因此我需要考虑目标架构的本机整数大小。显而易见的方法是使用cfg attribute target_pointer_width。例如,要定义始终能够容纳超过最大原生 int 大小的最小类型:
#[cfg(target_pointer_width = "16")]
type LargeInt = u32;
#[cfg(target_pointer_width = "32")]
type LargeInt = u64;
#[cfg(target_pointer_width = "64")]
type LargeInt = u128;
然而,在调查这个问题时,我遇到了this comment。它给出了一个架构示例,其中原生 int 大小与指针宽度不同。因此,我的解决方案不适用于所有架构。另一种可能的解决方案是编写一个构建脚本,该脚本生成一个小模块,该模块根据usize 的大小定义LargeInt(我们可以像这样获取:std::mem::size_of::<usize>()。)但是,这与上面,因为usize is based on the pointer width 也是如此。最后一个明显的解决方案是简单地为每个架构保留一个原生 int 大小的映射。但是,此解决方案不优雅且无法很好地扩展,因此我想避免使用它。
所以,我的问题是:有没有办法找到目标的本机 int 大小,最好是在编译之前,以减少运行时开销?这种努力是否值得?也就是说,使用本机 int 大小与使用指针宽度之间是否可能存在显着差异?
【问题讨论】:
标签: optimization rust cpu-architecture bigint