通常使用多个单词来实现bignums,但我希望尽可能轻松地选择单词大小。这比看起来更棘手 - std::uint64_t
在许多32位编译器中都可用,但std::uint32_t
可能是32位机器上更好的选择。那么诱惑就是使用std :: size_t,但不能保证给定的架构std::size_t
是最有效的算术类型,例如在the new x32 Linux ABI std::size_t
上会是32位但std::uint64_t
仍然是最佳选择。
C ++ 11定义了各种大小的快速/最小类型,但它没有提供任何查询它们相对性能的方法。我意识到可能没有最好的可移植答案,我现在最好的猜测是默认为std::size_t
并在配置时检测异常架构。但也许有更好的方法?
答案 0 :(得分:5)
有效实现bignums的真正关键是你需要有一个加宽的乘法,它给你的基本字大小是2倍。因此,如果您的平台支持128位乘法结果,则只能使用uint64_t作为基本字大小。机器上指针的大小几乎无关紧要。
如果你真的想要尽可能便携的最有效的实现,你应该在编译时选择字大小。然后有一个autoconfig脚本(尝试)构建具有各种不同字长的代码,并测试这些构建的结果的正确性和速度。
#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=8
或16
或32
或64