Wie deaktiviere ich Compiler-Optimierungen in gcc?

Lesezeit: 4 Minuten

Neals Benutzer-Avatar
Nein

Ich versuche, Assemblersprache zu lernen. Ich habe gesucht und gefunden, wie man a zerlegt .c Datei, aber ich denke, es erzeugt eine optimierte Version des Programms. Gibt es eine Möglichkeit, dass ich den genauen Assembler-Code sehen kann, der meiner C-Datei entspricht.

  • das gcc Optionen, die Optimierungen steuern gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Optimize-Options.html

    – abeln

    23. April 2011 um 18:03 Uhr


  • Der optimierte Code ist den genauen Code, der Ihrer C-Datei entspricht. Der Blick auf die Disassemblierung des nicht optimierten Codes erweckt einen falschen Eindruck. Es wird dich glauben machen, dass du es besser machen kannst.

    – Hans Passant

    23. April 2011 um 18:42 Uhr

  • Wie Hans sagt – die Idee beim Schreiben in Assembler-Code ist es, es besser zu machen als der Compiler. Wenn Sie sich den optimierten Code ansehen, werden Sie sehen, wie schwer das ist!

    – Bo Persson

    23. April 2011 um 22:01 Uhr


  • verwandt: Wie entferne ich “Rauschen” aus der GCC/Clang-Assembly-Ausgabe?

    – Peter Cordes

    4. Februar 2019 um 5:30 Uhr

  • Warum springen Leute immer mit schlauen Kommentaren ein, ohne das Q richtig zu lesen. Es ist sehr offensichtlich, dass der Benutzer eine möglichst klare Ausgabe wünscht, um ihm zu helfen. Compiler sind viel klüger als die meisten Programmierer und jeder, der denkt, dass der optimierte Code für einen Neuling genauso hilfreich ist wie der nicht optimierte Code, denkt nicht darüber nach. Was er tut, ist eine sehr übliche Art, Assembler zu lernen, und gcc zu sagen, dass es NICHT optimieren soll, ist eine Sache.

    – RichieHH

    20. November 2020 um 14:32 Uhr

Benutzeravatar von pmr
pmr

Die gcc-Option -O ermöglicht verschiedene Optimierungsstufen. Verwenden -O0 um sie zu deaktivieren und zu verwenden -S zur Ausgangsbaugruppe. -O3 ist die höchste Optimierungsstufe.

Beginnend mit gcc 4.8 die Optimierungsstufe -Og ist verfügbar. Es ermöglicht Optimierungen, die das Debuggen nicht beeinträchtigen, und ist die empfohlene Standardeinstellung für den standardmäßigen Bearbeitungs-Kompilierungs-Debug-Zyklus.

Um den Dialekt der Assembly entweder in Intel oder Att zu ändern, verwenden Sie -masm=intel oder -masm=att.

Sie können bestimmte Optimierungen auch manuell mit aktivieren -fname.

Schauen Sie sich die an gcc-Handbuch für viel mehr.

  • Und -O0 ist der Standardwert (keine Optimierung), wenn Sie keine -O-Flags angegeben haben.

    – Nr

    23. April 2011 um 18:02 Uhr


  • Mit -O0 haben Sie immer noch Optimierung: Reduzieren Sie die Kompilierzeit und sorgen Sie dafür, dass das Debugging die erwarteten Ergebnisse liefert.

    – klm123

    27. November 2013 um 17:06 Uhr

  • @ klm123 Richtig, aber es ist so nah wie möglich, was besser als nichts ist.

    – pmr

    27. November 2013 um 17:11 Uhr

  • Wenn Sie ein einigermaßen modernes gcc haben, das -Og unterstützt, versuchen Sie es. Ich finde, dass es oft besser lesbare Assembly-Ausgaben liefert als -O0.

    – Viktor Dahl

    27. April 2016 um 7:25 Uhr

  • @ViktorDahl Danke für den Hinweis. Ich habe die Antwort geändert.

    – pmr

    27. April 2016 um 8:55 Uhr

Für gcc möchten Sie keine auslassen -O1 -O2 oder -O3 Optionen, die an den Compiler übergeben werden, oder wenn Sie sie bereits haben, können Sie die anhängen -O0 Möglichkeit, es wieder auszuschalten. Es könnte Ihnen auch helfen, hinzuzufügen -g for debug, damit Sie den C-Quellcode und den zerlegten Maschinencode in Ihrem Debugger sehen können.

Siehe auch: http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html

Benutzeravatar von user3770818
Benutzer3770818

Um ohne Kopieren zu testen und zu sehen, wie Sie Konstruktoren/Operatoren in Aktion kopieren/verschieben, fügen Sie “-fno-elide-constructors” hinzu.

Selbst ohne Optimierungen (-O0 ) führen GCC und Clang immer noch eine Kopierelision durch, was in einigen Fällen dazu führt, dass Kopier-/Verschiebekonstruktoren übersprungen werden. In dieser Frage finden Sie Einzelheiten zum Entfernen von Kopien.

In Clang 3.4 löst es jedoch einen Fehler aus (ein ungültiges temporäres Objekt ohne den Konstruktor aufzurufen), der in 3.5 behoben wird.

Benutzeravatar von MByD
MByD

Verwenden Sie die Befehlszeilenoption -O0 (-[capital o][zero]), um die Optimierung zu deaktivieren, und -S Montagedatei zu erhalten. Aussehen hier um weitere gcc-Befehlszeilenoptionen anzuzeigen.

Sie können Optimierungen auch intern mit #pragma GCC push_options steuern

#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */     

.... code here .....

#pragma GCC pop_options

Benutzeravatar von Derviş Kayımbaşıoğlu
Derviş Kayımbaşıoğlu

Lange her, aber immer noch nötig.

info - https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
list - gcc -Q --help=optimizers test.c | grep enabled
disable as many as you like with:
  gcc **-fno-web** -Q --help=optimizers test.c | grep enabled

Benutzeravatar von Nils Pipenbrinck
Nils Pipenbrink

Sie können Optimierungen deaktivieren, wenn Sie -O0 mit der gcc-Befehlszeile übergeben.

Um beispielsweise eine .C-Datei in eine .S-Datei umzuwandeln, rufen Sie Folgendes auf:

gcc -O0 -S test.c

  • -O0 ist überflüssig, da es der Standardwert ist.

    – Jens

    7. März 2014 um 12:40 Uhr

1420400cookie-checkWie deaktiviere ich Compiler-Optimierungen in gcc?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy