Я посмотрел на то, как C ++ 11 определяет арифметику указателей, и не увидел ничего, что помешало бы выравниванию типа быть больше его размера. Компилятор будет отвечать за то, чтобы каждый элемент в массиве был правильно выровнен (путем вставки нужного количества отступов) и за то, чтобы арифметика указателей работала правильно. По сути, арифметика указателей не определяется со ссылкой на sizeof (* ptr), хотя люди обычно говорят об этом так, как будто это так.
n3290 § 5.7 p5:
Когда выражение с целочисленным типом добавляется или вычитается из указателя, результат имеет тип операнда указателя. Если операнд-указатель указывает на элемент объекта массива, а массив достаточно велик, результат указывает на смещение элемента от исходного элемента, так что разность индексов результирующего и исходного элементов массива равна интегральному выражению.
редактирование:
Однако оператор sizeof
определен в терминах смещения между последовательными элементами в массиве, поэтому alignof(X)
не может быть больше, чем sizeof(X)
, потому что это будет означать, что массив X содержит объекты с недопустимыми выравниваниями. , В то же время, sizeof(X)
не обязательно представляет реальный размер объекта. Например. член X или базовый подобъект другого типа может использовать для хранения менее sizeof(X)
байт, хотя я не знаю ни одной реализации, которая фактически использует это.