【发布时间】:2017-07-30 07:53:38
【问题描述】:
我正在尝试实现一个 bigInt 库。我一直在检查其他库,如 GMP、ttmaht 或 libtommath,但它们中的任何一个都满足项目的要求(因为许可证,因为它们只使用堆栈等)
我将遵循 libtommath 的方法(非常有据可查,并且全部用 C 编写),但我希望所有内容都存储在堆中。 libtommath 在类似这样的结构中实现了 bigInt:
typedef struct {
int used, alloc, sign;
mp_digit *dp;
} mp_int;
如您所见,它具有访问值的间接方式。 (mp_digit 是大整数的位数)。我想摆脱间接,所以在堆中有某种类似的结构,其中最后一个元素是 mp_digit[],其中每个 mp_int 实例的大小可能不同。
我可以使用 void* 和 malloc() 来做到这一点,因为我知道第一个 X 位置是带有信息(使用、分配、符号等)的 int,然后知道偏移量后访问 mp_digit[],但我不喜欢这样主意。我想知道哪种方法更好。
我发现了其他类似的问题,例如 this one 或 this one,但它们不会全部存储在堆中,所以我的问题有点棘手/不同。
谢谢,
【问题讨论】:
-
请选择一种语言。
-
将
mp_digit *dp;更改为std::vector<mp_digit> dp;删除used和alloc -
作为定义和使用此类结构的示例,您可以查看
LOGPALETTE(some usage example)。基本上,您只需分配缓冲区来保存结构本身,然后紧跟项目数组。 -
您想要的整数不能用作局部变量。
-
@juanchopanza 我将使用 C++ 编译器对其进行编译,因此如果我们可以使用 C++ 的一些优点/抽象,那就太好了。如果我必须以 C 开发人员的身份编写应用程序的这一部分,我没有问题。
标签: c++ c heap-memory biginteger multiprecision