stdatomic.h
タイプandのバージョンであるand が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 名
int
N_t
は、幅 N、パディング ビットなし、および 2 の補数表現を持つ符号付き整数型を指定します。したがって、int8_t
正確に 8 ビット幅の符号付き整数型を示します。2 typedef 名
uint
N_t
は、幅 N でパディング ビットのない符号なし整数型を指定します。したがって、uint24_t
正確に 24 ビット幅の符号なし整数型を示します。3 これらのタイプはオプションです。ただし、実装が幅が 8、16、32、または 64 ビットで、パディング ビットがなく、2 の補数表現を持つ (符号付きの型の場合) 整数型を提供する場合、対応する 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
タイプなどを含める)
段落3で強調する価値があります。
ただし、実装が幅が 8、16、32、または 64 ビットで、パディング ビットがなく、2 の補数表現を持つ (符号付きの型の場合) 整数型を提供する場合、対応する typedef 名を定義する必要があります。
これは、たとえば、2 の補数表現の 16 ビット整数として実装されるint
orのような型がある場合、実装でを定義する必要があることを意味します。short
int16_t
のatomic_
型はN1548<stdatomic.h>
にもリストされています(以下に再現)が、実装に aがある場合に対応する要件はありません--- それが私の質問の性質です。int16_t
atomic_int16_t
7.17.6 アトミック整数とアドレス型
1 次の表の各行では、原子型名が対応する直接型として宣言されています。
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
タイプはアトミックブール値を提供します。4
atomic_address
型はアトミックな void * 操作を提供します。加減算の単位は 1 バイトとする。5 注意 アトミック整数型とアドレス型の表現は、対応する通常の型と同じサイズである必要はありません。既存のコードを移植するために必要な労力を軽減するため、可能な限り同じサイズにする必要があります。