Выравнивание элементов конструкции в GCC - PullRequest
2 голосов
/ 20 июля 2011

Я портирую проект msvc, в котором есть несколько библиотек, и каждая библиотека имеет определенные структуры выравнивания членов.Использование выравнивания по умолчанию вызвало много фатальных проблем со смещением, и поиск в Google сказал мне, что я могу решить эту проблему, установив выравнивание для каждой структуры / класса / объединения вручную с флагом __attribute__ ((aligned (MY_ALIGN))), однако есть одна вещь, которая меня беспокоит:

Скажем для простоты, что проект A использует выравнивание по 1 байту, а проект B, который активно использует функциональность проекта A и включает в себя множество его заголовков, имеет выравнивание по 16 байтов.Будет ли проблема с этим, или я думаю слишком много, и это будет просто работать?У меня плохое предчувствие, что при создании библиотеки компилятор msvc устанавливает выравнивание для каждой структуры во всех заголовках (независимо от того, включены ли они в проект или на которые ссылаются источники).Это правда?И если это так, скажите, пожалуйста, как настроить выравнивание для эмуляции настройки выравнивания элементов структуры MSVC?

Ответы [ 2 ]

1 голос
/ 20 июля 2011

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

Это может определенно привести к некоторым проблемам.Например, проект A определяет структуру и выравнивает все ее элементы по границе байта (упакован) и экспортирует функцию, принимающую указатель на эту структуру.Затем, если проект B по какой-либо причине компилируется в такой среде, что та же самая структура выравнивается по-другому, было бы невозможно передать адрес экземпляра этого struct непосредственно в эту экспортированную подпрограмму.Они имеют разные sizeof s как минимум в A и B.

Простое правило таково:
1) если вы хотите взаимодействовать с какой-то внешней скомпилированной библиотекой, вы должны убедиться, что структуравыравнивание согласуется с тем, которое используется компилятором библиотеки.Это касается структур, присутствующих в заголовках библиотеки.Хорошие библиотеки пытаются минимизировать усилия, предоставляя #pragma для некоторых компиляторов, чтобы обеспечить правильное выравнивание.
2) если вы используете структуры внутри какого-то вашего проекта, вы можете оставить его в покое, просто напишите переносимый код, которыйне полагается на какое-то конкретное выравнивание, оно подойдет.

1 голос
/ 20 июля 2011

Не думаю, что с этим должна быть проблема. Просто помните, что невыровненный доступ (минимум 4 байта, я думаю, на большинстве систем) будет стоить вам (хотя в некоторых ситуациях вы экономите место, хотя и не так много). Сами структуры имеют атрибут, и компилятор будет выполнять всю арифметику с указателями, так что, пока заголовки не связываются с определениями друг друга, все должно быть в порядке.

...