6

通常 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在配置时默认并检测异常架构。但也许有更好的方法?

4

1 回答 1

5

有效实现 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)and并使用or或orWORD(X2(WORD_SIZE))进行编译
-DWORD_SIZE=8163264

于 2012-10-15T00:19:33.993 回答