Я знаю, почему 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.