Есть ли ключевое слово GCC, чтобы позволить переупорядочить структуру?

Я знаю, почему GCC не переопределяет элементы структуры по умолчанию, но я редко пишу код, который опирается на порядок структуры, так что я могу указать, что мои структуры будут автоматически переупорядочены?

Ответ 1

Предыдущие версии GCC имели -fipa-struct-reorg позволяющую переупорядочивать структуру в режиме -fwhole-program + -combine.

  • -fipa-struct-reorg

    Выполните оптимизацию реорганизации структуры, которая изменяет расположение C-подобных структур, чтобы лучше использовать пространственную локализацию. Это преобразование действует для программ, содержащих массивы структур. Доступно в двух режимах компиляции: на основе профиля (включается с -fprofile-generate) или статического (который использует встроенную эвристику). Требовать -fipa-type-escape чтобы обеспечить безопасность этого преобразования. Он работает только в режиме всей программы, поэтому для его -fwhole-program требуется -fwhole-program и -combine. Структуры, считающиеся 'cold' результате этого преобразования, не затрагиваются (см. --param struct-reorg-cold-struct-ratio=value).

Он был удален после GCC 4.8.x по причинам, указанным ниже в примечании к выпуску.

Оптимизация struct reorg и matrix reorg (параметры командной строки -fipa-struct-reorg -fipa-matrix-reorg и -fipa-matrix-reorg) были удалены. Они не всегда работали правильно и не работали с оптимизацией по времени соединения (LTO), поэтому были применимы только к программам, состоящим из одного блока перевода.

Однако вы все равно можете попробовать struct-reorg-branch на GCC SVN или github, отражая свой собственный риск, поскольку он все еще находится в активной разработке.

Вы также можете изменить порядок полей с помощью инструмента clang-reorder-fields в clang-tools-extra

Смотрите также

Ответ 2

В GCC такой опции нет. И, я уверен, это невозможно внедрить разумным образом. О настройках прокладки смотрите эту дискуссию.

Единственное исключение, которое я знаю, это разделение полей горячей/холодной структуры, что может быть сделано в некоторых случаях (но я не уверен, что GCC может это сделать даже в режиме с профилем, я знаю, что ICC может). Эта функция не находится под контролем пользователя и выполняется на графиках вызовов, где доказуемо консервативность такого преобразования по потоку данных.

Ответ 3

Я думаю, что можно реорганизовать/разделить элементы структуры при компиляции всей программы (режим lto, использовать флаг -flto). В этом случае у вас есть полное представление о программе, а для символов, которые не исчезают, должно быть возможно переупорядочить их для улучшения поведения кэша и т.д.

В магистрали gcc это активно развивается. Это было представлено в GNU cauldron 2015. Возможно, вы захотите попробовать gcc trunk или struct-reorg-branch.

https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizations+of+Structures+and+Objects.pdf