【问题标题】:C++ handling of numerical data types of different sizesC++ 处理不同大小的数值数据类型
【发布时间】:2021-08-19 23:44:34
【问题描述】:

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

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

我发现这是一个具有挑战性的问题,因为 C++ 中要求为每个标识符保留特定类型。我会感谢你的 cmets。

【问题讨论】:

  • 跟踪实际类型以及指针偏移量的任何开销都可能超过使用足够大的整数类型(即unsigned long long)所付出的代价。
  • C++ 不包括它作为标准 C++ 库的一部分。您必须创建自己的,或使用众多 C++ bigint 实现之一或 Boost multiprecision
  • 是否需要存储大于单个机器字容量的值?
  • 如果您知道数字大小的分布,那么您可以设计一种压缩算法来有效地存储一系列这些数字。权衡涉及读回数字的速度与最低存储要求。
  • 一个模板可以让你定义类型是什么,一个从参数推导出类型的函数(如std::make_pair)会使其相当透明。但是请记住,比较结构会更加困难,因为它们不是兼容的类型 - 您必须进行特殊的成员比较。

标签: c++ bigint data-representation


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多