Подтвердить что ты не робот

Является ли выравнивание 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.

Это имеет смысл?

4b9b3361

Ответ 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 и т.д., Но это не является жестким требованием.