C++ 处理不同大小的数值数据类型

问题描述

假设您有一个存储自然数的数据结构(尽管实数面临的挑战是相同的)。您希望数据结构消耗所需的最少内存,但确实希望支持大数值。理想的数据结构将每个值存储在内存中的大小适合该值的区域中。

我的问题:C++ 是否提供任何工具来应对这一挑战?我可以尝试通过分配我自己的内存缓冲区并将指针从我的数据结构中保留到缓冲区中来尝试制定“C方式”解决方案,但现在我保留指针而不是数字,从内存大小来说,没有太大的改进。

我发现这是一个具有挑战性的问题,因为 C++ 要求为每个标识符保留特定类型。我将不胜感激您的意见。

解决方法

您希望数据结构消耗所需的最少内存 但您确实希望支持大数值。理想的数据结构将每个值存储在内存中的大小适合该值的区域中。

表示比您想象的要复杂。假设我想要存储的数字是 2 的 1014 次方。我可以使用 127 字节的二进制表示来存储它。但我也可以决定一种不同的表示方式,它占用更少的空间,例如一种可变长度表示,其中我只能存储数字 1014,并且指示二进制表示中只有 1 位。具体来说,我可以存储一个 RLE 编码的二进制表示。

事实上,可以证明“理想”表示,渐近地,将存储生成所需数字作为输出的最短图灵机的表示。那是数字的Kolmogorov/Solomonoff complexity,无法计算!

但让我们把讨论带回到现实......

我的问题:C++ 是否提供任何工具来应对这一挑战?

好吧,在 C 和 C++ 中,您都有不同大小的语言级整数类型,以及提供一些具有特定大小的整数类型(int8_tint16_t 等)的 stdint.h/<cstdint> 标头. 和 uint8_t、uint16_t` 等 - 大小以位为单位)。

我可以尝试通过分配我自己的内存缓冲区并将指针从我的数据结构中保留到缓冲区中来尝试制定“C方式”解决方案,但现在我保留了指针而不是数字,没有太大的改进,内存-尺寸说话。

如果您希望能够存储任意大的数字,则无法避免必须动态分配内存 - 无论是 C 还是 C++。不同之处在于这种分配是如何进行的,以及您如何管理基于分配的内存的数字表示数据结构并与之交互。这种数据结构通常被称为“大整数”或简称为“bigint”。提供这些并支持任意精度小数的库通常被称为“多精度”库。

当然,您可以查看一些 bigint 和多精度数字库。也许最著名和最古老的之一是 Boost Multiprecision。一些较新且相对流行的大整数库是 faheel's BigIntKaspars Klavin's bigint

在 C 中,它可能是 GMP - The GNU Multiprecision library,这也是 Boost Multiprecision 的“后端”之一。