Гарантируется ли шаг шага char [] равным 1, если char [] находится внутри структуры __attribute __ ((выровненный))? - PullRequest
0 голосов
/ 08 декабря 2018

Итак, скажем, у меня есть структура, которая выглядит следующим образом (оказывается, довольно часто встречается в реальном мире):

struct foo {
    char[24] bar;
    uint32_t fnord;
    uint32_t quux;
}__attribute__((aligned(4));

Что такое шаг bar, то есть&bar[1] - &bar[0], учитывая, что это в struct foo?Это имеет значение для sizeof(foo), который, я уверен, я хотел бы быть 32, и я также хотел хорошие быстрые операции выравнивания на foo.fnord и foo.quux, иначе он не был бы выровнен во-первых.

1 Ответ

0 голосов
/ 08 декабря 2018

На параграф 6.2.5 / 20 стандарта,

Тип массива описывает непрерывно распределенный непустой наборобъектов с конкретным типом объекта-члена

(выделение добавлено). Таким образом, элементы массива всегда находятся в памяти непрерывно.Это одна из определяющих характеристик массива.Связь, класс хранения, членство в другой структуре данных, требование выравнивания самого массива или любой структуры данных, содержащей его, - ни один из них не влияет на смежность элементов массива.

Требование выравнивания массива обычнократный этому типу элемента, так что выравнивание самого массива также выравнивает все его элементы.Ни в коем случае элементы массива не подлежат индивидуальному выравниванию.

...