2017-01-11 1 views
6

Wiki Referenz erwähnt, dass einige Header irgendwann große Menge an Quellcode enthalten können und sie daher, wie bereits kompilierten Header Kompilierung Zeit sparen. https://en.wikipedia.org/wiki/Precompiled_headerWas ist der Unterschied zwischen vorkompilierte Header und vorkompilierte Binaries

Wenn der vorkompilierte Header kompilierten Quellcode enthalten kann, wie unterscheidet er sich dann von vorkompilierten Binärdateien.

+3

Es gibt so etwas wie einen nicht-vorkompilierte nein, so das Konzept der ‚vorkompilierte Binär‘ ist nicht wirklich eine Sache, etwas anderes zu in erster Linie zu vergleichen. – EJP

+0

danke für das Hinweis ... Ich denke, es sollte als vorkompilierte Quelle aufgerufen werden – bharath

Antwort

2

C++ definiert den Begriff einer "Übersetzungseinheit". Eine Übersetzungseinheit ist ein Ankerpunkt, an dem die Übersetzung beginnt, und ein Programm umfasst typischerweise mehrere solcher Übersetzungseinheiten. Welche Einheiten als "Übersetzungseinheit" an den Compiler übergeben werden, hängt von den Einstellungen in Ihrer IDE, Makefiles und anderen Konfigurationen ab. Aber informell die meisten Konfigurationen nehmen Ihre und .c - Dateien als Übersetzungseinheiten.

Um es einfacher, wir zu einem Programm dann mehrere Binärdateien einer Übersetzungseinheit als etwas, von dem ein Compiler eine binäre macht, und ein Linker kombiniert denken kann.

So Header-Dateien sind in der Regel nicht als Übersetzungseinheiten konfiguriert, und sie ergeben typischerweise keine binäre auf ihre eigenen, selbst wenn sie Quellcode enthalten. Sie werden eher aus Übersetzungseinheiten importiert und zusammen mit ihnen übersetzt.

Wenn solche Header-Dateien viel Quellcode enthalten, der in mehreren Übersetzungseinheiten enthalten sein wird, ist es sinnvoll, sie einmal (vor) zu kompilieren und so viele Informationen wie möglich in einem Zwischenergebnis zu speichern Das Kompilieren der eigentlichen Übersetzungseinheit ist schneller. Das spart Zeit, aber das "intermediate binary" ist etwas internes und nicht exponiert.

jedoch vom Inhalt und von der Art des Quellcodes darin, eine Header-Datei ist von anderen Quellcodedateien nicht unterscheidbar. Sie können eine "Header-Datei" an den Compiler als Übersetzungseinheit übergeben, und der Compiler wird tatsächlich eine "normale" Binärdatei daraus machen. Es ist nur so, dass sie normalerweise nicht als Root für die Kompilierung deklariert werden.

Hoffe, dass hilft.

1

Der Hauptunterschied ist, desto mehr Informationen in einem vorkompilierte Kopf zu einem kompilierten Quell Vergleich gespeichert. Wenn Sie eine Quelle zu einer Binärdatei kompilieren, gehen Informationen über Definitionen und Vorlagen verloren. Definiert die Werte zu ihren Werten und Vorlagen werden nur in instanziierter Form in die Binärdatei geschrieben. Ein vorkompilierter Header speichert die Informationen über die generische Form der Templates und den Namen und die Werte von Defines so, wie sie benötigt werden, wenn der vorkompilierte Header irgendwo enthalten ist. Für den vorkompilierten Header von pure source sind sie mit der kompilierten Quelle identisch.

+0

"Für reine Quelle vorkompilierte Header sind identisch mit kompilierten Quelle." Kann ich davon ausgehen, dass der Quellcodeteil direkt in Binärform konvertiert wird, wenn die .pch-Datei erstellt wird. – bharath

+1

Erstens: Es sollte keinen echten Code in einer Header-Datei neben Inline-Funktionen geben. Die Inline-Dateien werden höchstwahrscheinlich in echte Binärdateien konvertiert und an den Verwendungsort kopiert. Alles andere wie funktionsähnliche Makros und Templates, die die wichtigsten Teile von Code in Headerdateien sind, können nicht in Binärcode übertragen werden, da sie argumentabhängig sind. – user6556709

Verwandte Themen