A cosa serve la sezione COMDAT?

Vedo l’opzione / Gy e mi sto chiedendo perché lo userei? http://msdn.microsoft.com/en-us/library/xsa71f43.aspx

La risposta attualmente accettata è alquanto incompleta.

Lo scopo di una sezione COMDAT è di consentire la definizione di sezioni “duplicate” in più file object. Normalmente, se lo stesso simbolo è definito in più file object, 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 usate per aggirare questo problema. Quando una sezione è contrassegnata come COMDAT in un file object, 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 nella risposta attualmente accettata , 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.

/ 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 inserisce in una sezione di codice durante la compilazione. “main.cpp” usa solo una funzione da “a.cpp”, ma quando si collegano tutte le funzioni da “a.cpp” saranno collegate (due di esse 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. Durante la compilazione di una class, tutti i suoi metodi ottengono le proprie sezioni separate per impostazione predefinita.