确定在 C++11 中实现 bignums 的最有效字大小

Determining most efficient word size for implementing bignums in C++11?

本文关键字:有效字 bignums 实现 C++11      更新时间:2023-10-16

通常 bignums 是通过使用多个单词来实现的,但我想尽可能便携地选择单词大小。这比看起来更棘手 - std::uint64_t在许多32位编译器中可用,但std::uint32_t可能是32位机器上的更好选择。 因此,诱惑将是使用std::size_t,但是对于给定的体系结构,不能保证std::size_t是最有效的算术类型,例如在新的x32 Linux ABI上,std::size_t将是32位,但std::uint64_t仍然是最佳选择。

C++11 定义了各种大小的快速/最小类型,但它没有提供任何查询它们相对性能的方法。我意识到可能没有最佳的便携式答案,我现在最好的猜测是默认std::size_t并在配置时检测异常架构。但也许有更好的方法?

有效实现 bignums 的真正关键是你需要有一个加宽的乘法,给你的位数是基本字大小的 2 倍。 因此,如果您的平台支持 128 位乘法结果,则只能使用 uint64_t 作为基本字大小。 计算机上指针的大小在很大程度上无关紧要。

如果你真的想要尽可能可移植的最有效的实现,你应该在编译时选择字大小。 然后有一个自动配置脚本,该脚本(尝试)使用各种不同的字大小构建代码,并测试这些构建的结果的正确性和速度。

#define WORD_(SIZE)    std::uint ## SIZE ## _t
#define WORD(SIZE)     WORD_(SIZE)
#define X2_(SIZE)      X2_ ## SIZE
#define X2(SIZE)       X2_(SIZE)
#define X2_8           16
#define X2_16          32
#define X2_32          64
#define X2_64          128

在代码中使用WORD(WORD_SIZE)WORD(X2(WORD_SIZE))并进行编译
-DWORD_SIZE=8163264