О структуре __alignof в c - PullRequest
       5

О структуре __alignof в c

0 голосов
/ 16 марта 2011

значение __alignof является выравниванием Требование самого большого элемента в структура.

Почему ??

Ответы [ 3 ]

3 голосов
/ 16 марта 2011

Откуда вы взяли цитату? Если вы истолковываете это буквально, это совершенно неправильно. Например:

struct s
{
    char array[100];
    long x;
}

Очевидно, что выравнивание структуры соответствует x, а не array. Правило должно гласить:

Выравнивание структуры такое же, как у элемента с наивысшим выравниванием.

Теперь, к настоящему вопросу, почему структура должна иметь такое выравнивание? Хорошо, представьте, что у вас есть структура и доступ к члену внутри нее. Если структура будет иметь меньше выравнивания, чем встроенный элемент, доступ к элементу может быть выполнен без выравнивания, что обычно вызывает ошибку времени выполнения из-за базового оборудования.

1 голос
/ 16 марта 2011

Поскольку подсистемы памяти не могут извлекать любой фрагмент данных, выровненный по любому адресу.

Естественная граница фрагмента данных такова, что

address % sizeof(x) == 0

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

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

0 голосов
/ 16 марта 2011

При использовании правил компоновки структуры по умолчанию, которые используются большинством компиляторов, в вашу структуру вставляется заполнение, так что каждое поле в структуре имеет собственное выравнивание, то есть каждое поле равно или превышает собственный размер слова для цели машина попадает на границу слова. Чтобы убедиться, что компоновка выполняется правильно, необходимо, чтобы вся структура была выровнена до того же количества.

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

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