Was ist "inkrementelle Verknüpfung"?


105

Ich habe mir das MSDN von Microsoft und das gesamte Web angesehen, konnte mir aber immer noch keine wirklich gute Vorstellung davon machen, was es ist.

Bedeutet dies, dass das abgeschlossene Programm DLLs zu unterschiedlichen Zeiten während seiner Ausführung lädt, wie dies beim Start für alle gleichzeitig gilt?

Bin ich total weit weg? :) :)


1
Ich habe eine Antwort für GNU ld hinzugefügt, diese wurde jedoch gelöscht. Hier ist eine ähnliche: stackoverflow.com/questions/29391965/…
Ciro Santilli 法轮功 冠状 病 六四 事件 29

Es wurde gelöscht, weil Kopieren, Einfügen und Divergen schlecht ist - egal wie gut der Inhalt ist en.wikipedia.org/wiki/Don%27t_repeat_yourself
MarcH

Antworten:


122

Beim Verknüpfen werden alle aus Ihren Quelldateien erstellten OBJ-Dateien sowie alle von Ihnen referenzierten LIB-Dateien in Ihre Ausgabe (z. B. EXE oder DLL) gepackt.

Ohne inkrementelle Verknüpfung muss dies jedes Mal von Grund auf neu erfolgen.

Inkrementelle Verknüpfungen verknüpfen Ihre exe / dll auf eine Weise, die es dem Linker erleichtert, die vorhandene exe / dll zu aktualisieren, wenn Sie eine kleine Änderung vornehmen und neu kompilieren.

Inkrementelle Verknüpfungen beschleunigen das Kompilieren und Verknüpfen Ihres Projekts.

Der einzige Laufzeiteffekt, den es haben könnte, ist, dass Ihre exe / dll dadurch etwas größer und langsamer wird, wie hier beschrieben:

http://msdn.microsoft.com/en-us/library/4khtbfyf.aspx

Bearbeiten: Wie von Logan erwähnt, ist die inkrementelle Verknüpfung auch nicht mit der Generierung des Verbindungszeitcodes kompatibel, wodurch eine mögliche Leistungsoptimierung verloren geht.

Möglicherweise möchten Sie inkrementelle Verknüpfungen für Debug-Builds verwenden, um die Entwicklung zu beschleunigen. Deaktivieren Sie sie jedoch für Release-Builds, um die Laufzeitleistung zu verbessern.

Verzögerungsgeladene DLLs sind möglicherweise das, woran Sie denken:

http://msdn.microsoft.com/en-us/library/151kt790.aspx


Ah, ich dachte, Linker haben das sowieso immer gemacht! Wenn Sie also abschalten, incremental linkingwird der Linker jedes Mal alles von Grund auf neu verknüpfen?
Russel

6
"In der Praxis lohnt es sich wahrscheinlich nicht, sich darüber Gedanken zu machen." Es ist wahrscheinlich erwähnenswert, dass der Unterschied zwischen "normaler" Verknüpfung und inkrementeller Verknüpfung zur Laufzeit möglicherweise nicht so leistungsfähig ist, die inkrementelle Verknüpfung jedoch nicht mit der Generierung von Verknüpfungszeitcode kompatibel ist, was einen drastischen Leistungsunterschied bewirken kann.
Logan Capaldo

2
@Russel: Ja wird es. @Logan: Danke, ich habe meine Antwort aktualisiert.
Saxon Druce

Bedeutet das also, dass wir diese Option für Produktions-Builds deaktivieren sollten?
RBT

1
@RBT, ja du musst.
Ajay

15

Wichtig ist auch, dass inkrementelle Links eine Voraussetzung dafür sind Edit&Continue, dass Sie Ihren Code möglicherweise bearbeiten und sofort neu kompilieren können, ohne ihn neu starten zu müssen.

Es ist also eine gute Sache, Debug-Builds zu verwenden, aber keine Builds zu veröffentlichen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.