alignof (char) == 1? - PullRequest
       21

alignof (char) == 1?

6 голосов
/ 25 августа 2011

sizeof (char) всегда равен 1, и мне кажется, что требование выравнивания для типа никогда не может быть больше его размера. Цитирование из будущего стандарта C ++ 11 (3.11):

Алигмент - это целочисленное значение, определяемое реализацией, представляющее количество байтов между последовательными адресами, по которым данный объект может быть выделен.

Таким образом, если бы выравнивание типа было больше его размера, было бы невозможно создать массивы без пустого пространства между последовательными элементами.

Является ли эта интерпретация правильной и, таким образом, выровняется (char) == 1 всегда?

Ответы [ 2 ]

1 голос
/ 01 октября 2011

Вы правы.

Из «компактного» (без отступов) макета массивов C ++ можно сделать вывод, что любой тип объекта, такой как массив этого типа, может быть определениметь выравнивание, которое является делителем его размера.

В частности, выравнивание такого типа размера 1 должно быть 1.

В частности, выравнивание char, signed char, а unsigned char равно 1.

OTOH, вы ничего не можете сделать о выравнивании абстрактного класса с этим аргументом.

0 голосов
/ 30 августа 2011

Я посмотрел на то, как C ++ 11 определяет арифметику указателей, и не увидел ничего, что помешало бы выравниванию типа быть больше его размера. Компилятор будет отвечать за то, чтобы каждый элемент в массиве был правильно выровнен (путем вставки нужного количества отступов) и за то, чтобы арифметика указателей работала правильно. По сути, арифметика указателей не определяется со ссылкой на sizeof (* ptr), хотя люди обычно говорят об этом так, как будто это так.

n3290 § 5.7 p5:

Когда выражение с целочисленным типом добавляется или вычитается из указателя, результат имеет тип операнда указателя. Если операнд-указатель указывает на элемент объекта массива, а массив достаточно велик, результат указывает на смещение элемента от исходного элемента, так что разность индексов результирующего и исходного элементов массива равна интегральному выражению.

редактирование:

Однако оператор sizeof определен в терминах смещения между последовательными элементами в массиве, поэтому alignof(X) не может быть больше, чем sizeof(X), потому что это будет означать, что массив X содержит объекты с недопустимыми выравниваниями. , В то же время, sizeof(X) не обязательно представляет реальный размер объекта. Например. член X или базовый подобъект другого типа может использовать для хранения менее sizeof(X) байт, хотя я не знаю ни одной реализации, которая фактически использует это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...