Стандарт C не допускает определенных оптимизаций структур: например, перегруппировка полей, объединение полей, отбрасывание полей, которые никогда не считываются, выведение полей из структуры, если они могут быть превращены в автоматические переменные и т. д. Это необходимо по разным причинам, включая согласованные структуры компоновки в единицах компиляции и разрешающие структуры, совместимые с литьем.Оптимизация структуры компилятора C
Какие-нибудь современные компиляторы (например, gcc, clang, Visual C) поддерживают расширения, которые позволяют мне сказать, что это is хорошо для этих оптимизаций?
Разумеется, они имели бы смысл только для определений, которые были локальными для одного блока компиляции, чтобы компилятор мог видеть все возможные виды использования структуры; и некоторые вещи (например, вышеупомянутые определения структуры, совместимые с литой) станут непригодными. Но для определенных задач это может быть очень ценной оптимизацией.
Я знаю, что НКУ используется иметь -fipa-struct-reorg
вариант, позволяющий точно, но он никогда не работал очень хорошо, и немного сгнили, и в конце концов вынимают. Но я не знаю, было ли это заменено чем-нибудь. И я не смог найти что-либо в clang, что меня удивляет, потому что я думаю, что это именно та оптимизация, что clang будет на всем протяжении ...
Будет ли возможность оптимизировать такие вещи? –
он * может * помочь, если вы предоставите struct variables storage class 'register', который гарантирует, что вы не полагаетесь на макет памяти на уровне языка; однако оптимизатор должен уметь это понять независимо от наличия 'register', и я не знаю, имеет ли это значение на практике ... – Christoph
Не работает, к сожалению, но стоит попробовать --- та. ('register' недействителен для членов структуры или статических переменных и, по-видимому, игнорируется в автоматических переменных.) –