确定在 C++11 中实现 bignums 的最有效字大小
Determining most efficient word size for implementing bignums in 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 作为基本字大小。 计算机上指针的大小在很大程度上无关紧要。
如果你真的想要尽可能可移植的最有效的实现,你应该在编译时选择字大小。 然后有一个自动配置脚本,该脚本(尝试)使用各种不同的字大小构建代码,并测试这些构建的结果的正确性和速度。
#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
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何使用 stl 容器有效地存储对象?(即根据其字段的值进行搜索)
- 在UDP套接字上多次调用Connect()以发送到不同的目标地址 - 有效
- 确定在 C++11 中实现 bignums 的最有效字大小
- 通过套接字发送二进制文件.文本文件有效,其他文件无效
- 如何有效地从该对象中包含的另一个对象访问对象字段/属性
- 处理客户端连接的最有效方法(套接字编程)
- 如何在点上拆分字符串并有效地提取所有字段
- 基于多个字段搜索大型数据集的有效方法
- 即使在文件描述符不可用的情况下,也能有效地侦听多个套接字
- 在派生类中同时分配多个字段-为什么这样做有效
- 在std::set/std::map中存储具有多个不同类型字段的c++对象的有效方法
- 指向重复GPB字段项的指针是否在该字段被修改时仍然有效
- c++位字段(有效地传递它,也就是.语法糖)
- 如何在c++中连接字面值字符串和宏到有效的字符串
- 在预处理条件中使用布尔字面值是否有效?
- 我如何有效地使用boost asio套接字进行全双工流