2009-12-02 11 views

risposta

68

Il currently accepted answer è alquanto incompleto.

Lo scopo di una sezione COMDAT è di consentire la definizione di sezioni "duplicate" in più file oggetto. Normalmente, se lo stesso simbolo è definito in più file oggetto, il linker riporterà errori. Ciò può causare problemi per alcune funzionalità del linguaggio C++, come i modelli, che possono creare un'istanza degli stessi simboli in diversi file cpp.

Le sezioni COMDAT sono utilizzate per aggirare questo problema. Quando una sezione è contrassegnata come COMDAT in un file oggetto, specifica anche un flag che indica come devono essere risolti i conflitti. Ci sono un sacco di opzioni, tra cui "scegli quello che ti piace", "assicurati che tutti i duplicati abbiano le stesse dimensioni", "assicurati che tutti i duplicati abbiano lo stesso contenuto", "scegli il più grande", ecc. le specifiche COFF per un elenco completo.

In ogni caso, a differenza di quanto affermato da currently accepted answer, non ci sono requisiti, in un modo o nell'altro, su quale debba essere il contenuto di una sezione COMDAT. Possono contenere una procedura, molte procedure, dati o qualsiasi combinazione di codice e dati.

5

/L'opzione Gy è buona per essere utilizzata nelle versioni di rilascio. perché ogni funzione ha una propria sezione, il linker può rilasciare ogni pezzo di codice inutilizzato. Se non si specifica/l'opzione Gy si otterrà qualcosa del genere: "a.cpp" definisce 3 funzioni e il compilatore le mette in una sezione di codice durante la compilazione. "main.cpp" utilizza solo una funzione da "a.cpp", ma quando si collegano tutte le funzioni da "a.cpp" sarà collegato (due di loro come un onere). E se ogni funzione avesse la propria sezione, il linker potrebbe prenderne solo uno che contenesse la funzione necessaria per "main.cpp". La compilazione senza/Gy è una buona opzione per le build di debug. Quando si compila una classe, tutti i suoi metodi ottengono le proprie sezioni separate per impostazione predefinita.

+3

Questo è vecchio, ma per le informazioni di chiunque: non è così che funziona il linker. C'è un interruttore totalmente diverso che controlla le funzioni senza riferimento:/OPT: REF (Ottimizzazione-> Riferimenti: Sì). C'è un altro sotto esso che unisce le stesse funzioni,/OPT: ICF. ICF funziona solo con/Gy, ma REF funziona con o senza di esso. – SilverbackNet

Problemi correlati