似乎包含 atomic_uint_least16_t和atomic_uint_fast16_t是类型 uint_least16_t和uint_fast16_t的_Atomic版本,但不包含atomic_uint16_t。为什么?
获取来自N1548草案的一些背景信息
7.18.1.1精确宽度整数类型 1类型胡枝子名称
intN_t指定一个带符号整数类型,其宽度为N,没有填充位,并指定两个补码表示形式。因此,int8_t表示这种宽度正好为8位的带符号整数类型。 2类型胡枝子名称uintN_t指定宽度为N且没有填充位的无符号整数类型。因此,uint24_t表示这种宽度正好为24位的无符号整数类型。 3这些类型是可选的。但是,如果实现提供宽度为8、16、32或64位的整数类型,没有填充位,并且(对于有符号类型)具有两个补码表示形式的整数类型,则它将定义相应的typedef名称。 7.18.1.2最小宽度整数类型 1类型胡枝子名称int_leastN_t指定宽度至少为N的有符号整数类型,这样大小较小的有符号整数类型至少具有指定的宽度。因此,int_least32_t表示宽度至少为32位的有符号整数类型。 2类型胡枝子名称uint_leastN_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_fastN_t / uint_fastN_t类型等)
值得在第3段强调的是:
但是,如果实现提供宽度为8、16、32或64位的整数类型,没有填充位,并且(对于有符号类型)具有两个补码表示形式的整数类型,则它将定义相应的typedef名称。
这意味着,例如,如果我有一个像int或short这样的类型,它被实现为一个16位整数,具有两个补码表示,那么实现将定义int16_t。
<stdatomic.h>的atomic_类型也在N1548中列出(转载如下),但它没有提出相应的要求,即如果实现有一个int16_t,那么就有一个atomic_int16_t --这就是我问题的本质。
7.17.6原子整数和地址类型 1对于下表中的每一行,原子类型名称被声明为对应的直接类型。 原子类型名称直接类型uint _Atomic unsigned int atomic_long _Atomic long atomic_ulong _Atomic未签名的long atomic_llong _Atomic long atomic_ullong _Atomic_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_uint_least32_t int_least32_t en22 20 en22#原子_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 _Atomic en21 20fast64_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 _Atomic en19 20# 2在7.17.7中定义了对这些类型的操作的语义。 3
atomic_bool类型提供了一个原子布尔值。 4atomic_address类型提供原子性的void *操作。加减法的单位应为一个字节。 5注意,原子整数和地址类型的表示不需要与其相应的正则类型具有相同的大小。只要有可能,它们应该具有相同的大小,因为它可以简化移植现有代码所需的工作。
发布于 2020-07-12 18:28:24
这个专门化原子类型的列表之所以存在,是因为一次历史性的事故,它的目的是确保与C++的兼容性。而且,它们仅用于为强制的整数类型提供接口。没有一个uintXX_t类型是强制性的,因此它们不包括在内。
(这个目标很快就被加入了atomic_[u]intprt_t,[u]intptr_t不是强制性的,但这可能是另一回事。)
发布于 2020-07-12 18:05:13
我只能猜测,但是如果您只能实现对比uint16_t更大的事物的原子访问,那么实现对uint_least16_t和uint_fast16_t的原子访问总是可以通过相应定义类型来完成的,而使用可用的硬件对uint16_t的原子访问可能是不可能的。而且你不想要标准中任何无法实现的东西。
https://stackoverflow.com/questions/62864237
复制相似问题