char
C++ 标准是否对, wchar_t
, char16_t
,的字节大小排序提供任何保证char32_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 大小 [expr.sizeof]
... 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 基本类型 [basic.fundamental]
... wchar_t 类型应具有与其他整数类型之一相同的大小、符号和对齐要求 (3.11),称为其基础类型。类型 char16_t 和 char32_t 分别表示与 <cstdint> 中的 uint_least16_t 和 uint_least32_t 具有相同大小、符号和对齐方式的不同类型,称为基础类型。
更新:我没有在标准中找到它。cppreference说uint_leastN_t
:
宽度分别至少为 8、16、32 和 64 位的最小无符号整数类型
请注意, sizeof(char)==1 并不意味着char 有 8 位。另请参阅C++ 常见问题解答。cppreference说关于 CHAR_BIT:
字节中的位数
1.7/1 C++ 内存模型 [intro.memory]
C++ 内存模型中的基本存储单元是字节。一个字节至少足够大以包含基本执行字符集(2.3)的任何成员......
在 64 位 Qt Creator(使用 Clang)中,wchar_t
是四 (4) 个字节。
类型char16_t
和char32_t
分别定义为与 和 相同的uint_least16_t
大小uint_least32_t
。
上不存在这样的约束wchar_t
,除了它必须至少与 一样大char
(当然,对于C 和 C++ 中的所有数据类型都是如此)。存在具有 1 字节、2 字节 (MSVC++) 和 4 字节 (GCC) 宽字符的实际实现。