Является ли выравнивание char в C (и С++) гарантией 1?
Может ли alignof(char)
быть только 1?
Из неофициальной cppreference.com wiki:
Самое слабое (наименьшее) выравнивание - это выравнивание типов char
, signed char
и unsigned char
, и обычно оно равно 1.
"Обычно" означает, что это может быть что-то другое.
Единственное, что устанавливает стандарт C относительно выравнивания char
(C11 N1570 6.2.8, пункт 1):
Требование выравнивания полного типа можно запросить с помощью выражения _Alignof
. Типы char
, signed char
и unsigned char
должны иметь самое слабое требование выравнивания.
Однако рассмотрим определение выравнивания (C11 N1570 6.2.8, абзац 1 и определено аналогично для С++ 11):
Согласование представляет собой целочисленное значение, определенное реализацией, представляющее количество байтов между последовательными адресами, в которых может быть выделен данный объект.
Из этого я не думаю, что выравнивание char
имеет смысл, но 1
из-за требования, что sizeof(char) ≡ 1
, что означает, что расстояние между соседними элементами char
может быть только 1
.
Это имеет смысл?
Ответы
Ответ 1
Да Хотя это утверждение явно не указано в стандартах, я предполагаю, что оно может быть выведено из них:
N1570 6.5.3.4 Операторы sizeof и _Alignof
4 Когда sizeof
применяется к операнду с type char
, unsigned char
или signed char
(или его квалифицированной версией), результатом будет 1
. При применении к операнду, который имеет тип массива, результатом является общее количество байтов в массиве.
Взять char
например. Скажем, у нас есть char charArr[2];
, sizeof charArr
гарантированно будет равно 2
, а sizeof charArr[0]
= sizeof charArr[1]
= 1
. Это означает, что два соседних объекта типа char
занимают 2 байта.
Следовательно, можно сделать вывод, что "количество байтов между последовательными адресами, по которым может быть выделен символ", составляет по меньшей мере 1
. Кроме того, выравнивание char
должно быть положительным целым числом, поэтому оно не может быть любым числом, кроме 1
.
Ответ 2
Я не юрист на языке, но если мы посмотрим на раздел 6.5.3.4, пункт 3 документа C:
При применении к операнду, который имеет тип char, unsigned char или подписанный char, (или его квалифицированной версии), результат равен 1.
Для меня это не означает, что размер char
должен быть одним, а результат операнда sizeof
должен возвращаться. 1. Выравнивание также не совпадает с размером. Выравнивание продиктовано стандартами ABI, а не C или С++. Конечно, верно, что выравнивание char
равно 1 на x86, x86_64 и т.д., Но это не является жестким требованием.