Nehmen wir an, ich habe ein Programm in C geschrieben und es mit gcc und g ++ kompiliert, welche Kompilierung wird schneller laufen? gcc oder g ++? Ich denke, die g ++ Kompilierung wird es langsam machen, aber ich bin mir nicht sicher.
Lassen Sie mich meine Frage wegen der Widerlegung von gcc erneut klären.
Sagen wir, ich kompiliere Programm a.c wie folgt auf der Konsole.
%Vor%welcher a.out wird schneller laufen?
GCC ist eine Compiler-Sammlung. Es wird hauptsächlich zur Kompilierung von C, C ++, Ada, Java und vielen weiteren Programmiersprachen verwendet.
G ++ ist ein Teil der GNU Compiler Collection (gcc).
Ich meine, gcc enthält auch g ++. Wenn wir gcc für die Kompilierung von C ++ verwenden, wird g ++ verwendet. Die Ausgabedateien werden anders sein, da der G ++ - Compiler eine eigene Laufzeitbibliothek verwendet.
Bearbeiten: Okay, um Dinge zu verdeutlichen, weil wir hier ein bisschen verwirrt sind. GCC ist die GNU Compiler-Sammlung. Es kann Ada, C ++, C und anderthalb Milliarden andere Sprachen kompilieren. Es ist ein "Backend" für die verschiedenen Sprachen Frontend-Compiler wie GNAT. Lesen Sie den Link, den ich oben auf der Seite von GCC.GNU.Org erstellt habe.
GCC kann sich auch auf den GNU C Compiler beziehen. Dies wird C ++ - Code kompilieren, wenn der Befehl -lstdc ++ gegeben wird, aber normalerweise wird er würgen und sterben, weil er die C ++ - Bibliotheken nicht einzieht.
G ++, der GNU C ++ Compiler ist wie der GNU C Compiler ein Frontend der GNU Compiler Collection. Es ist der Unterschied zwischen dem C-Compiler, dass er diese Bibliotheken automatisch mit einbezieht und ein paar kleinere Verbesserungen durchführt, da angenommen wird, dass C ++ - Code zum Kompilieren verwendet wird.
Hier kommt die Verwirrung her. Verdeutlicht dies die Dinge ein wenig?
Erstens: Die Frage (und einige der anderen Antworten) scheinen auf der fehlerhaften Prämisse zu beruhen, dass C eine strikte Teilmenge von C ++ ist, was aber nicht der Fall ist. Kompilieren von C als C ++ ist nicht das gleiche wie das Kompilieren von C: es kann die Bedeutung Ihres Programms ändern!
C wird hauptsächlich als C ++ kompiliert und wird meistens die gleichen Ergebnisse liefern, aber es gibt einige Dinge, die explizit definiert sind , um ein anderes Verhalten zu geben.
Hier ist ein einfaches Beispiel - wenn das Ihre a.c
ist:
dann Kompilierung als C wird ein Ergebnis geben:
%Vor% und das Kompilieren als C ++ ergeben ein anderes Ergebnis (es sei denn, Sie verwenden eine ungewöhnliche Plattform, auf der int
und char
die gleiche Größe haben):
, weil die C-Spezifikation ein Zeichenliteral mit dem Typ int
definiert und die C ++ - Spezifikation den Typ char
definiert.
Zweitens: gcc
und g++
sind nicht "derselbe Compiler". Es wird derselbe Backend-Code verwendet, aber die C- und C ++ - Frontends sind unterschiedliche Codeabschnitte ( gcc/c-*.c
und gcc/cp/*.c
in der gcc-Quelle).
Auch wenn Sie sich an die Teile der Sprache halten, die für die gleiche Sache definiert sind, gibt es keine Garantie, dass das C ++ - Frontend den Code genau wie das C-Frontend analysiert (dh genau das gibt gleiche Eingabe an das Back-End), und daher keine Garantie, dass der generierte Code identisch sein wird. Es ist also sicherlich möglich , dass man in manchen Fällen schneller Code generieren kann als der andere - obwohl ich mir vorstelle, dass man komplexen Code benötigt, um eine Chance zu haben, einen Unterschied zu finden Die Optimierung und die Code-Generierung erfolgt im gemeinsamen hinteren Ende des Compilers; und der Unterschied könnte gleich sein.
Ich denke, sie werden beide den gleichen Maschinencode und damit die gleiche Geschwindigkeit auf Ihrem Computer erzeugen.
Wenn Sie herausfinden wollen, könnten Sie die Assembly für beide kompilieren und die beiden vergleichen, aber ich wette, dass sie die gleiche Assembly und daher den gleichen Maschinencode erstellen.
Profiliere es und probiere es aus. Ich bin mir sicher, dass es vom tatsächlichen Code abhängt, selbst wenn es möglicherweise einen wirklich merkwürdigen Fall erfordern würde, irgendeinen anderen Bytecode zu erhalten. Obwohl, wenn Sie nicht extern C {}
um Ihren C-Code haben, und oder gut in C funktioniert, bin ich mir nicht sicher, wie "es als C ++ kompilieren" könnte jede Geschwindigkeit bieten, es sei denn, die bestimmten Compiler-Optimierungen in g ++ < em> einfach passieren , um ein bisschen besser für Ihre spezielle Situation zu sein ...
Der generierte Maschinencode sollte identisch sein. Die g ++ - Version von a.out wird wahrscheinlich in ein paar zusätzlichen Support-Bibliotheken verlinken. Dadurch wird die Startzeit von a.out durch einige Systemaufrufe langsamer.
Es gibt jedoch keinen praktischen Unterschied. Der Linux-Linker wird nicht merklich langsamer, bis Sie 20-40 verknüpfte Bibliotheken und Tausende von zu lösenden Symbolen erreichen.
Die ausführbaren Dateien gcc und g ++ sind nur Frontends, sie sind nicht die eigentlichen Compiler. Sie beide führen die tatsächlichen C oder C ++ - Compiler (und ld, ar, was immer benötigt wird, um die gewünschte Ausgabe zu produzieren) basierend auf den Dateierweiterungen. So erhalten Sie genau das gleiche Ergebnis. G ++ wird häufig für C ++ verwendet, da es mit der C ++ - Standardbibliothek (Iostreams usw.) verknüpft ist.
Wenn Sie C-Code als C ++ kompilieren möchten, ändern Sie entweder die Dateierweiterung, oder machen Sie etwas wie folgt:
%Vor%