Як вимкнути оптимізацію компілятора в gcc?


78

Я намагаюся вивчити мову асемблера. Я шукав і знаходив, як розібрати .cфайл, але, на мою думку, він видає якусь оптимізовану версію програми. Чи є спосіб, щоб я міг побачити точний код збірки, який відповідає моєму файлу C.


1
параметри gcc , які контролюють оптимізацію gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Optimize-Options.html
abeln

3
Оптимізований код - це точний код, який відповідає вашому файлу C. Дивлячись на розбирання неоптимізованого коду, створюється неправильне враження. Це змусить вас думати, що ви можете зробити краще.
Ганс Пассант,

1
Як каже Ганс - ідея написання коду збірки полягає в тому, щоб зробити це краще, ніж компілятор. Якщо ви подивитесь на оптимізований код, то побачите, наскільки це важко!
Бо Перссон,


Відповіді:


108

Параметр gcc -Oзабезпечує різні рівні оптимізації. Використовуйте -O0для їх вимкнення та використовуйте -Sдля виведення збірки. -O3- це найвищий рівень оптимізації.

Починаючи з gcc 4.8 -Og, доступний рівень оптимізації . Це дозволяє оптимізації, які не заважають налагодженню, і є рекомендованим за замовчуванням для стандартного циклу редагування-компіляції-налагодження.

Щоб змінити діалект збірки на intel або att використовуйте -masm=intelабо -masm=att.

Ви також можете ввімкнути певні оптимізації вручну за допомогою -fname.

Подивіться посібник з gcc, щоб дізнатись більше.


33
І -O0є типовим (без оптимізації), якщо ви не вказали жодного прапору -O.
nos

11
З -O0 у вас все ще є оптимізація: Скоротіть час компіляції та змушуйте налагоджувати результати, що очікуються.
klm123

@ klm123 Правильно, але це наближення, як ви можете отримати, що краще, ніж ніщо.
pmr

3
Якщо у вас є досить сучасний gcc, який підтримує -Og, спробуйте, я виявляю, що він часто дає більш читабельний вихід збірки, ніж -O0.
Віктор Даль

@ViktorDahl Дякую за підказку. Я доповнив відповідь.
pmr

10

Для gcc ви хочете опустити будь-які параметри -O1 -O2 або -O3 , передані компілятору, або якщо вони вже є, ви можете додати опцію -O0, щоб знову вимкнути її. Це також може допомогти вам додати -g для налагодження, щоб ви могли бачити вихідний код c та розібраний машинний код у своєму налагоджувачі.

Див. Також: http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html


9

Щоб протестувати без копіювання елізії та побачити, як ви копіюєте / переміщуєте конструктори / оператори в дії, додайте "-fno-elide-constructors".

Навіть без оптимізації (-O0), GCC та Clang все одно виконуватимуть копіювання, що в деяких випадках пропускає конструктори копіювання / переміщення. Дивіться це питання, щоб отримати докладні відомості про копіювання.

Однак у Clang 3.4 він справді запускає помилку (недійсний тимчасовий об'єкт без виклику конструктора), що виправлено в 3.5.


7

Використовуйте параметр командного рядка -O0(- [capital o] [zero]), щоб вимкнути оптимізацію та -Sотримати файл збірки. Подивіться тут, щоб побачити більше параметрів командного рядка gcc.


4

Давно, але все ще потрібен.


4

Ви також можете внутрішньо керувати оптимізацією за допомогою #pragma GCC push_options


3

Ви можете відключити оптимізацію, якщо передаєте -O0 за допомогою командного рядка gcc.

Наприклад, щоб перетворити файл .C на виклик файлу .S:

тест gcc -O0 -S.c


3
-O0є зайвим, оскільки є типовим.
Йенс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.