Ich sehe die Option/Gy und frage mich, warum ich es verwenden würde? http://msdn.microsoft.com/en-us/library/xsa71f43.aspxWozu dient der COMDAT-Bereich?
Antwort
Die currently accepted answer ist etwas unvollständig.
Der Zweck eines COMDAT-Abschnitts besteht darin, dass "doppelte" Abschnitte in mehreren Objektdateien definiert werden können. Wenn dasselbe Symbol in mehreren Objektdateien definiert ist, meldet der Linker normalerweise Fehler. Das kann Probleme für einige C++ - Sprachenfeatures wie Vorlagen verursachen, die die gleichen Symbole in anderen cpp-Dateien instanziieren können.
COMDAT-Abschnitte werden verwendet, um dies zu umgehen. Wenn ein Abschnitt als COMDAT in einer Objektdatei markiert ist, gibt er auch ein Flag an, das angibt, wie Konflikte gelöst werden sollen. Es gibt eine Reihe von Optionen, einschließlich "wählen Sie einfach jemanden, den Sie mögen", "stellen Sie sicher, dass alle Dups. Sind die gleiche Größe", "stellen Sie sicher, alle Dups. Haben den gleichen Inhalt", "wählen Sie die größte", etc. Siehe die COFF-Spezifikation für eine vollständige Liste.
In jedem Fall, anders als was die currently accepted answer sagte, gibt es keine Anforderungen, auf die eine oder andere Weise, auf was der Inhalt einer COMDAT-Abschnitt sein muss. Sie können eine Prozedur, viele Prozeduren, Daten oder eine beliebige Kombination von Code und Daten enthalten.
/Gy-Option ist gut in Release-Builds verwendet werden. Weil jede Funktion ihren eigenen Bereich hat, kann Linker jedes unbenutzte Stück Code löschen. Wenn Sie keine/Gy-Option angeben, erhalten Sie etwa Folgendes: "a.cpp" definiert 3 Funktionen und der Compiler fügt sie beim Kompilieren in einen Codeabschnitt ein. "main.cpp" verwendet nur eine Funktion von "a.cpp", aber wenn alle Funktionen von "a.cpp" verknüpft werden, wird (zwei von ihnen als eine Belastung) verknüpft. Und wenn jede Funktion ihren eigenen Abschnitt hat, könnte der Linker nur einen aufrufen, der die von "main.cpp" benötigte Funktion enthält. Kompilieren ohne/Gy-Option ist gut für Debug-Builds. Beim Kompilieren einer Klasse erhalten alle Methoden standardmäßig eigene Abschnitte.
Das ist alt, aber für jedermanns Informationen: So funktioniert der Linker nicht. Es gibt einen ganz anderen Schalter, der nicht referenzierte Funktionen steuert:/OPT: REF (Optimierung-> Referenzen: Ja). Es gibt ein anderes Recht darunter, das identische Funktionen,/OPT: ICF, zusammenführt. ICF funktioniert nur mit/Gy, aber REF funktioniert mit oder ohne. – SilverbackNet
mögliches Duplikat von [Function-LeveL Linking (/ Gy Schalter in VC++) - Wofür ist es gut?] (Http://stackoverflow.com/questions/629894/function-level-linking-gy-switch-in -vc-was-ist-es-gut-für) –