C++ 在堆中定义不同大小的结构
我正在尝试实现一个bigInt库。我一直在检查其他库,如,或,但其中任何一个都满足项目的要求(因为许可证,因为它们只使用堆栈,等等) 我将遵循libtommath的方法(非常好地用C编写文档),但我希望所有的内容都存储在堆中。libtommath在如下结构中实现bigInt:C++ 在堆中定义不同大小的结构,c++,c,heap-memory,biginteger,multiprecision,C++,C,Heap Memory,Biginteger,Multiprecision,我正在尝试实现一个bigInt库。我一直在检查其他库,如,或,但其中任何一个都满足项目的要求(因为许可证,因为它们只使用堆栈,等等) 我将遵循libtommath的方法(非常好地用C编写文档),但我希望所有的内容都存储在堆中。libtommath在如下结构中实现bigInt: typedef struct { int used, alloc, sign; mp_digit *dp; } mp_int; 正如您所见,它有一个用于访问值的间接方法。(mp_数字是大整数的数字)。我
typedef struct {
int used, alloc, sign;
mp_digit *dp;
} mp_int;
正如您所见,它有一个用于访问值的间接方法。(mp_数字是大整数的数字)。我想脱离间接寻址,在堆中有一些类似的结构,其中最后一个元素是mp_digit[],其中mp_int的每个实例的大小可能不同
我可以使用void*和malloc()实现,因为我知道前X个位置是int,带有信息(已使用、alloc、符号等),然后访问mp_数字[],知道偏移量,但我不喜欢这个想法。我不知道哪一种方法更好
我发现了其他类似的问题,比如或,但它们并没有全部存储在堆中,所以我的问题有点棘手/不同
谢谢,在C中创建类似的内容
mp_int *LN_Create(int ndigits, int allocate)
{
mp_int *ln = calloc(1, sizeof mp_int);
if (ln != NULL)
{
ln->ndigits = ndigits;
if (allocate)
{
ln->dp = calloc(ndigits, sizeof mp_digit);
ln->alloc = 1;
if (ln->dp == NULL)
{
free(ln);
ln = NULL;
}
}
}
return ln;
}
或
在C语言中,创建类似这样的内容
mp_int *LN_Create(int ndigits, int allocate)
{
mp_int *ln = calloc(1, sizeof mp_int);
if (ln != NULL)
{
ln->ndigits = ndigits;
if (allocate)
{
ln->dp = calloc(ndigits, sizeof mp_digit);
ln->alloc = 1;
if (ln->dp == NULL)
{
free(ln);
ln = NULL;
}
}
}
return ln;
}
或
在C中,
mp\u 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)
的偏移量,但可能更小;在计算实际分配的最小大小时,有一个拙劣的宏破解(但这仍然是可移植的)
该定义在C++中不起作用,但可以使用指向C++中不完整类型的指针。
请注意,灵活数组成员与1字节数组(如C中的不兼容,mp\u 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)
的偏移量,但可能更小;在计算实际分配的最小大小时,有一个拙劣的宏破解(但这仍然是可移植的)
该定义在C++中不起作用,但可以使用指向C++中不完整类型的指针。
请注意,灵活数组成员与1字节数组(如in)不兼容,请选择一种语言。更改mp\u digit*dp代码>到std::vector dp
removeused
和alloc
作为定义和使用此类结构的示例,您可以查看()。基本上,你只需分配缓冲区保持结构本身,就可以通过一系列的项目来跟踪。你所希望的int不能用作本地变量。@ JuangopangZa我将用C++编译器编译它,所以如果我们能使用C++的一些好处/抽象的话,它是很好的。如果我必须以C开发人员的身份编写应用程序的这一部分,我不会有任何问题。请选择一种语言代码>到std::vector dp
removeused
和alloc
作为定义和使用此类结构的示例,您可以查看()。基本上,你只需分配缓冲区保持结构本身,就可以通过一系列的项目来跟踪。你所希望的int不能用作本地变量。@ JuangopangZa我将用C++编译器编译它,所以如果我们能使用C++的一些好处/抽象的话,它是很好的。如果我必须以C开发人员的身份编写应用程序的这一部分,我不会有任何问题。这完全是毫无意义的,因为它需要2个分配,并且间接寻址没有被删除。这是OP所要求的。我不评论他的需要。结构的字段正好显示了他想要的内容。他写了“想要摆脱间接寻址”,您的代码显示的内容与他已经得到的内容基本相同。没有注意到这句话这是完全没有意义的,因为它需要2个分配,间接寻址没有被删除。这是OP要求的。我不评论他的需要。结构的字段正好显示了他想要的内容。他写了“想要摆脱间接寻址”,您的代码显示的内容与他已经得到的内容基本相同。没有注意到这句话