2017-07-30 85 views
0

我试图实现bigInt库。我一直在检查其他图书馆一样GMPttmahtlibtommath但其中的任何履行项目的要求(因为许可证,因为他们只使用堆栈等)在不同大小的堆中定义结构

我会按照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 onethis one,但他们并没有全部存储在堆中,所以我的技术有点棘手/不同。

谢谢

+8

请选择一种语言。 – juanchopanza

+0

将'mp_digit * dp;'改为'std :: vector dp;'remove'used''' alloc' –

+1

作为定义和使用这种结构的示例,您可以查看['LOGPALETTE'](https:// msdn.microsoft.com/en-us/library/windows/desktop/dd145040(v=vs.85).aspx)([一些使用示例](https://stackoverflow.com/questions/45319996/how-to-构造-A-图片处理对象-从-A-设备从属HBITMAP/45337644#45337644))。基本上你只是分配缓冲区保持结构本身立即跟随的项目数组。 – VTT

回答

0

用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; 
} 

mp_int *LN_Create1(int ndigits) 
{ 
    size_t allocsize = sizeof mp_int + (ndigits - 1) * sizeof mp_digit; 
    mp_int *ln = malloc(allocsize); 

    if (ln != NULL) 
    { 
     memset(ln, 0, allocsize); 
     ln->ndigits = ndigits; 
    } 
    return ln; 
} 
+3

这是完全没有意义的,因为它需要2个分配,而间接性不会被删除。 – VTT

+0

这是OP所要求的。我不评论他的需求。结构的领域正好显示他想要的东西。 –

+2

他写下了“想要脱离间接”,你的代码基本上显示了他已经拥有的同样的东西。 – VTT

2

Ç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