Оптимизация структуры компилятора Си - PullRequest
8 голосов
/ 28 марта 2012

Стандарт C не допускает определенной оптимизации структур: например, переупорядочение полей, объединение полей, отбрасывание полей, из которых никогда не считываются, удаление полей из структуры, если их можно превратить в автоматические переменные, и т. Д. Этонеобходим по разным причинам, включая согласованные структуры структур в единицах компиляции и использование совместимых с приведением типов структур.

Какие-нибудь современные компиляторы (например, gcc, clang, Visual C) поддерживают расширения, которые позволяют мне сказать, что это нормально ли выполнять эти оптимизации?

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

Я знаю, что gcc использовал , чтобы иметь опцию -fipa-struct-reorg, чтобы разрешить именно это, но это никогда не работало очень хорошосгнил, и в конце концов был вынут.Но я не знаю, было ли это заменено чем-либо.И я не смог найти ничего в clang, что меня удивило, потому что я подумал, что это именно тот тип оптимизации, которым clang будет повсюду ...

1 Ответ

4 голосов
/ 28 марта 2012

Нет.Нет никакой причины для такой вещи.

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

  2. Если вы можете пройти и выполнить анализ, необходимый для пометки элементов структуры, что «это можно оптимизировать, если не использовать» (остерегайтесь прикольных макросов вычисления смещения), тогда вы сможете сами убедиться, нужно ли это или нет, и взять его самостоятельно.

  3. Если не уверены, просто закомментируйте его и посмотрите, получите ли выошибка компиляции.

...