Различных размеров структур для decNumberCopy () в libdecnumber? - PullRequest
1 голос
/ 24 марта 2011

Я работаю с libdecnumber в проекте, и в библиотеке есть небольшая странная функция, чья документация меня немного смущает.Это функция decNumberCopy()

decNumber  * decNumberCopy(decNumber *, const decNumber *);

Вот определение decNumber

/* The size (integer data type) of each unit is determined by the   */
/* number of digits it will hold.                                   */
#if   DECDPUN<=2
  #define decNumberUnit uint8_t
#elif DECDPUN<=4
  #define decNumberUnit uint16_t
#else
  #define decNumberUnit uint32_t
#endif
/* The number of units needed is ceil(DECNUMDIGITS/DECDPUN)         */
#define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)

/* The data structure... */
typedef struct {
  int32_t digits;      /* Count of digits in the coefficient; >0    */
  int32_t exponent;    /* Unadjusted exponent, unbiased, in         */
                       /* range: -1999999997 through 999999999      */
  uint8_t bits;        /* Indicator bits (see above)                */
                       /* Coefficient, from least significant unit  */
  decNumberUnit lsu[DECNUMUNITS];
} decNumber;

Вот что документация libdecnumber должна сказать о decNumberCopy()

decNumberCopy (число, источник)

Эта функция используется для копирования содержимого одной структуры decNumber в другую.Он используется, когда структуры могут иметь разные размеры, и, следовательно, прямое копирование структуры с помощью присваивания С неуместно.Он также может иметь преимущества в производительности, когда число короткое относительно размера структуры, поскольку копируются только единицы, содержащие цифры, используемые в исходной структуре.

Таким образом, оставляя в стороне тот факт, чтопростого копирования структуры было бы достаточно для копирования decNumber, может кто-нибудь с большим пониманием того, как работает libdecnumber, скажет мне, когда две структуры decNumber будут иметь разный размер?Даже если предположить, что вы собрали два разных модуля компиляции, которые имели разные значения для DECNUMUNITS (что на самом деле ужасно), в decNumber отсутствует член размера, поэтому функция не сможет обнаружить разныеразмер в любом случае имеет значение.

Или, возможно, decNumberCopy() обобщено для будущей версии библиотеки, в которой отдельным decNumber s будет разрешено различаться по размеру?

1 Ответ

1 голос
/ 24 марта 2011

Я предполагаю, что этот комментарий от decNumber.h должен объяснить следующее:

  /* Notes: */
  /* 1. If digits is > DECDPUN then there will be more than one */
  /*    decNumberUnits immediately following the first element of lsu. */
  /*    These contain the remaining (more significant) digits of the */
  /*    number, and may be in the lsu array, or may be guaranteed by */
  /*    some other mechanism (such as being contained in another */
  /*    structure, or being overlaid on dynamically allocated storage). */

Другими словами, структура decNumber содержит массив decNumberUnit lsu[DECNUMUNITS] для хранения количества цифр по умолчанию,но библиотека при необходимости увеличит массив до этого размера.

Обновление:

Быстрый взгляд на decNumber.c (хотя я не знаю, насколько он близок к последнему) выглядит такесли они не реализовали никакой поддержки для хранения цифр сверх того, что может храниться в decNumber.lsu[DECNUMUNITS].Похоже, что decNumberCopy() больше заботится о копировании только используемых элементов lsu[DECNUMUNITS] вместо всего (в качестве оптимизации и / или для тестирования, чтобы обнаружить возможное повреждение данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...