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

时间:2012-10-13 20:36:45

标签: c++ c++11 integer portability abi

通常使用多个单词来实现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并在配置时检测异常架构。但也许有更好的方法?

1 个答案:

答案 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=8163264