Почему stdatomi c .h содержит atomic_uint_least16_t и atomic_uint_fast16_t, но не atomic_uint16_t? - PullRequest
3 голосов
/ 12 июля 2020

stdatomic.h, по-видимому, содержит atomic_uint_least16_t и atomic_uint_fast16_t, которые являются _Atomic версиями типов stdint.h uint_least16_t и uint_fast16_t, но он не содержит atomic_uint16_t. Почему?

Для получения некоторой справочной информации из проекта N1548 :

7.18.1.1 Целочисленные типы с точной шириной

1 typedef name int N _t обозначает целочисленный тип со знаком шириной N, без битов заполнения и представление с дополнением до двух. Таким образом, int8_t обозначает такой знаковый целочисленный тип шириной ровно 8 бит.

2 Имя typedef uint N _t обозначает беззнаковый целочисленный тип с шириной N и без битов заполнения. Таким образом, uint24_t обозначает такой беззнаковый целочисленный тип с шириной ровно 24 бита.

3 Эти типы являются необязательными. Однако, если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бита, без битов заполнения и (для подписанных типов), которые имеют представление с дополнением до двух, она должна определять соответствующие имена typedef.

7.18.1.2 Целочисленные типы минимальной ширины

1 Имя typedef int_least N _t обозначает целочисленный тип со знаком шириной не менее N, так что нет знаковый целочисленный тип меньшего размера имеет как минимум заданную ширину. Таким образом, int_least32_t обозначает целочисленный тип со знаком шириной не менее 32 бита.

2 Имя typedef uint_least N _t обозначает беззнаковый целочисленный тип с шириной не менее N, например что ни один беззнаковый целочисленный тип с меньшим размером не имеет хотя бы указанной ширины. Таким образом, uint_least16_t обозначает беззнаковый целочисленный тип с шириной не менее 16 бит.

3 Требуются следующие типы:

int_least8_t
int_least16_t
int_least32_t
int_least64_t
uint_least8_t
uint_least16_t
uint_least32_t
uint_least64_t

Все другие типы этой формы являются необязательными.

(и т. Д., Включая типы int_fast N _t / uint_fast N _t и т. Д. c.)

Стоит выделить в параграфе 3:

Однако, если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бит, без битов заполнения и (для типов со знаком), которые имеют дополнение до двух представление, оно должно определять соответствующие имена typedef.

Это означает, что если, например, у меня есть тип вроде int или short, который реализован как 16-битное целое число с двумя дополнительное представление, то реализация должна определять int16_t.

Типы atomic_ для <stdatomic.h> также перечислены в N1548] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf#page = 297 ) (воспроизведено ниже), но это не требует соответствующего требования, что если в реализации есть int16_t то есть atomic_int16_t --- это суть моего вопроса.

7.17.6 Atomi c целочисленные и адресные типы

1 Для каждой строки в следующей таблице имя типа atomi c объявлено как соответствующий прямой тип.

Atomic type name         Direct type
----------------         -----------
atomic_char              _Atomic char
atomic_schar             _Atomic signed char
atomic_uchar             _Atomic unsigned char
atomic_short             _Atomic short
atomic_ushort            _Atomic unsigned short
atomic_int               _Atomic int
atomic_uint              _Atomic unsigned int
atomic_long              _Atomic long
atomic_ulong             _Atomic unsigned long
atomic_llong             _Atomic long long
atomic_ullong            _Atomic unsigned long long
atomic_char16_t          _Atomic char16_t
atomic_char32_t          _Atomic char32_t
atomic_wchar_t           _Atomic wchar_t
atomic_int_least8_t      _Atomic int_least8_t
atomic_uint_least8_t     _Atomic uint_least8_t
atomic_int_least16_t     _Atomic int_least16_t
atomic_uint_least16_t    _Atomic uint_least16_t
atomic_int_least32_t     _Atomic int_least32_t
atomic_uint_least32_t    _Atomic uint_least32_t
atomic_int_least64_t     _Atomic int_least64_t
atomic_uint_least64_t    _Atomic uint_least64_t
atomic_int_fast8_t       _Atomic int_fast8_t
atomic_uint_fast8_t      _Atomic uint_fast8_t
atomic_int_fast16_t      _Atomic int_fast16_t
atomic_uint_fast16_t     _Atomic uint_fast16_t
atomic_int_fast32_t      _Atomic int_fast32_t
atomic_uint_fast32_t     _Atomic uint_fast32_t
atomic_int_fast64_t      _Atomic int_fast64_t
atomic_uint_fast64_t     _Atomic uint_fast64_t
atomic_intptr_t          _Atomic intptr_t
atomic_uintptr_t         _Atomic uintptr_t
atomic_size_t            _Atomic size_t
atomic_ptrdiff_t         _Atomic ptrdiff_t
atomic_intmax_t          _Atomic intmax_t
atomic_uintmax_t         _Atomic uintmax_t

2 Семантика операций с этими типами определена в 7.17. 7.

3 Тип atomic_bool предоставляет логическое значение atomi c.

4 Тип atomic_address обеспечивает операции atomi c void *. Единицей сложения / вычитания должен быть один байт.

5 ПРИМЕЧАНИЕ. Представление целочисленных и адресных типов atomi c не обязательно должно иметь тот же размер, что и их соответствующие обычные типы. По возможности они должны иметь одинаковый размер, так как это облегчает перенос существующего кода.

Ответы [ 2 ]

3 голосов
/ 12 июля 2020

Этот список специализированных типов atomi c существует только из-за исторической c аварии, когда они были предназначены для обеспечения совместимости с C ++. И они были предназначены только для предоставления интерфейсов для обязательных целочисленных типов. Ни один из типов uintXX_t не является обязательным, поэтому они не включены. это наверное еще одна история.)

0 голосов
/ 12 июля 2020
• 1000 * доступ к uint16_t может быть просто невозможен с доступным оборудованием. И вам не нужно ничего в стандарте, что не может быть реализовано.
...