2012-03-27 6 views
8

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

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

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

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

+0

Будет ли возможность оптимизировать такие вещи? –

+1

он * может * помочь, если вы предоставите struct variables storage class 'register', который гарантирует, что вы не полагаетесь на макет памяти на уровне языка; однако оптимизатор должен уметь это понять независимо от наличия 'register', и я не знаю, имеет ли это значение на практике ... – Christoph

+0

Не работает, к сожалению, но стоит попробовать --- та. ('register' недействителен для членов структуры или статических переменных и, по-видимому, игнорируется в автоматических переменных.) –

ответ

4

Нет. Нет причин для такого вещь, которая будет поставляться.

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

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

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

+0

Ну, конечно, но это не очень важно --- я не спрашивал о статическом анализе и, как я сказал в исходном вопросе, я вполне готов избегать ситуаций, когда оптимизация структур будет нарушать код. –

+1

@DavidGiven, я изо всех сил пытаюсь придумать прецедент для этой функции. Мой ответ, в основном, заключается в том, что его нет, поэтому он не предлагается. Если он у вас есть, добавьте его в вопрос. – Ben

Смежные вопросы