Почему GCC не оптимизирует структуры? - PullRequest
42 голосов
/ 23 сентября 2008

Системы требуют, чтобы определенные примитивы были выровнены по определенным точкам в памяти (от кратного числа до байтов, кратных 4, кратных от байтов до кратных 2 и т. Д.). Конечно, они могут быть оптимизированы, чтобы тратить наименьшее количество места при заполнении.

Мой вопрос: почему GCC не делает это автоматически? Отсутствует ли более очевидная эвристика (переменные порядка от требования к наибольшему размеру до наименьшего)? Зависит ли какой-то код от физического упорядочения его структур (это хорошая идея)?

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

Ответы [ 7 ]

74 голосов
/ 23 сентября 2008

gcc не переупорядочивает элементы структуры, потому что это нарушит стандарт Си. Раздел 6.7.2.1 стандарта C99 гласит:

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

25 голосов
/ 23 сентября 2008

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

9 голосов
/ 23 сентября 2008

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

6 голосов
/ 31 октября 2008

gcc SVN имеет оптимизацию реорганизации структуры (-fipa-struct-reorg), но она требует анализа всей программы и в настоящее время не очень эффективна.

1 голос
/ 18 февраля 2009

Не говоря уже о том, что это хорошая идея, но вы, безусловно, можете написать код, который опирается на порядок членов структуры. Например, как хак, люди часто приводят указатель на структуру как тип определенного поля внутри, к которому они хотят получить доступ, а затем используют арифметику указателя, чтобы туда попасть. Для меня это довольно опасная идея, но я видел, что она использовалась, особенно в C ++, для того, чтобы переменная, объявленная как private, была общедоступной, если она находится в классе из сторонней библиотеки и публично не инкапсулирована. Изменение порядка членов полностью сломало бы это.

1 голос
/ 23 сентября 2008
Компиляторы

C автоматически не упаковывают структуры именно потому, что таких проблем выравнивания, как вы упомянули. Доступ не на границах слов (32-битный на большинстве процессоров) влечет за собой серьезные потери на x86 и приводит к фатальным ловушкам на архитектурах RISC.

0 голосов
/ 12 сентября 2015

Возможно, вы захотите попробовать последнюю версию магистрали gcc или struct-reorg-branch, которая находится в активной разработке.

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

...