Гарантия на размер заказа на char, wchar_t, char16_t, char32_t
Предоставляет ли стандарт C++ какую-либо гарантию упорядочения размера в байтах char
, wchar_t
, char16_t
, char32_t
? (любая выписка из стандарта приветствуется)
Например, у меня есть гарантия, что:
sizeof(char) <= sizeof(wchar_t) <= sizeof(char16_t) <= sizeof(char32_t)
2 ответа
Это 1 == sizeof(char) <= sizeof(wchar_t)
а также 1 == sizeof(char) <= sizeof(char16_t) <= sizeof(char32_t)
,
5.3.3 / 1 Sizeof [expr.sizeof]
... sizeof(char), sizeof(char со знаком) и sizeof(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 обозначают различные типы с тем же размером, подписью и выравниванием, что и uint_least16_t и uint_least32_t, соответственно, в
, называемые базовыми типами.
Обновление: я не нашел его в стандарте. cppreference говорит для uint_leastN_t
:
наименьший целочисленный тип без знака с шириной не менее 8, 16, 32 и 64 бит соответственно
Обратите внимание, что sizeof(char)==1 не означает, что char имеет 8 бит. Смотрите также C++ FAQ. cppreference говорит о CHAR_BIT:
количество бит в байте
1.7/1 Модель памяти C++ [intro.memory]
Фундаментальным хранилищем в модели памяти C++ является байт. Байт, по крайней мере, достаточно большой, чтобы содержать любой элемент базового набора символов выполнения (2.3) ...
Типы char16_t
а также char32_t
определены как тот же размер, что и uint_least16_t
а также uint_least32_t
соответственно.
Нет таких ограничений на wchar_t
за исключением того, что он должен быть не менее char
(что, конечно, верно для всех типов данных в C и C++). Существуют реальные реализации с 1-байтовыми, 2-байтовыми (MSVC++) и 4-байтовыми (GCC) широкими символами.
В 64-битном Qt Creator (с использованием Clang) wchar_t
составляет четыре (4) байта.