Гарантия на размер заказа на 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) байта.

Другие вопросы по тегам