gpt4 book ai didi

c++ - 在堆中定义不同大小的结构

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:24 25 4
gpt4 key购买 nike

我正在尝试实现一个 bigInt 库。我一直在检查其他库,如 GMP , ttmahtlibtommath但它们中的任何一个都满足项目的要求(因为许可证,因为它们只使用堆栈等)

我将遵循 libtommath 的方法(非常有据可查,并且全部用 C 语言编写),但我希望所有内容都存储在堆中。 libtommath 在这样的结构中实现了 bigInt:

typedef struct  {
int used, alloc, sign;
mp_digit *dp;
} mp_int;

如您所见,它具有访问值的间接方式。 (mp_digit 是大整数的数字)。我想摆脱间接寻址,所以在堆中有某种类似的结构,其中最后一个元素是 mp_digit[],其中每个 mp_int 实例的大小可以不同。

我可以使用 void* 和 malloc() 来做到这一点,因为我知道第一个 X 位置是带有信息(使用、分配、符号等)的整数,然后访问知道偏移量的 mp_digit[] 但我不喜欢这样主意。我想知道哪种方法更好。

我发现了其他类似的问题,例如 this onethis one但它们并没有全部存储在堆中,所以我的有点棘手/不同。

谢谢,

最佳答案

C 中,mp_digit dp[] 表示一个灵活的数组成员。这出现在 C99 中:

typedef struct  {
int used, alloc;
signed char sign;
mp_digit dp[];
} mp_int;

您可以使用 malloc(sizeof(mp_int) + alloc * sizeof(mp_digit));; 分配内存;也有 realloc。

然而,根据 mp_digit 的类型,有一个模糊的东西可能会帮助您在这里节省一两个字节 - 也就是说,dp 的偏移不一定是sizeof(mp_int) 但可能更少;有一个用于计算要分配的实际最小大小的 kludgey 宏 hack(但这仍然是可移植的)。

该定义在 C++ 中不起作用,但您可以在 C++ 中使用指向不完整类型的指针。


请注意,灵活的数组成员不兼容 1 字节数组,例如 here

关于c++ - 在堆中定义不同大小的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45397622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com