保证在char、wchar_t、char16_t和char32_t上进行大小排序

Guarantee on size ordering on char, wchar_t, char16_t, char32_t

本文关键字:排序 char32 char16 char wchar      更新时间:2023-10-16

C++标准是否对charwchar_tchar16_tchar32_t的字节大小排序提供任何保证?(欢迎从标准中提取任何内容)

例如,我有保证吗:

sizeof(char) <= sizeof(wchar_t) <= sizeof(char16_t) <= sizeof(char32_t)

它是1 == sizeof(char) <= sizeof(wchar_t)1 == sizeof(char) <= sizeof(char16_t) <= sizeof(char32_t)

5.3.3/1 的尺寸

sizeof(char)、sizeof(signed char)和sizeof(unsigned char)为1。…[注意:特别是sizeof(bool),sizeof(char16_t),sizeof(char32_t)和sizeof(wchar_t)是实现定义的。75--尾注]。

3.9.1/5基本类型[基本.基本]

wchar_t类型应具有相同的大小、标记和对齐方式需求(3.11)作为其他积分类型之一,称为底层类型。类型char16_t和char32_t表示不同的类型具有与uint_list16_t相同的大小、签名性和对齐方式,并且uint_list32_t,分别在<cstilth>,称为底层类型。

更新:我还没有在标准中找到它。cppreference表示uint_leastN_t:

宽度至少为8、16、32和64的最小无符号整数类型位分别

请注意,sizeof(char)==1并不意味着意味着一个char有8位。另请参阅C++常见问题解答。cppreference说关于CHAR_BIT:

字节中的位数

1.7/1 C++内存模型[interro.memory]

C++内存模型中的基本存储单元是字节。A.字节至少足够大,可以包含基本执行字符集(2.3)…

类型char16_tchar32_t被定义为分别与uint_least16_tuint_least32_t大小相同。

wchar_t上不存在这样的约束,只是它必须至少与char一样大(当然,对于C和C++中的所有数据类型都是如此)。存在具有1字节、2字节(MSVC++)和4字节(GCC)宽字符的实际实现。

在64位Qt Creator(使用Clang)中,wchar_t是四(4)个字节。