Jos*_*vin 6 c++ portability integer abi c++11
通常使用多个单词来实现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作为基本字大小.机器上指针的大小在很大程度上是无关紧要的.
如果您真的想要尽可能便携的最有效的实现,那么您应该在编译时选择字大小.然后有一个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
Run Code Online (Sandbox Code Playgroud)
使用WORD(WORD_SIZE)与WORD(X2(WORD_SIZE))您的代码,并编译
-DWORD_SIZE=8或16或32或64