2010-12-31 6 views
9

In Visual Studio 2010, ho un progetto di libreria statica C/C++. Quando accendo l'opzione ottimizzazione totale del programma nella modalità versione, ottengo un file .lib che supera i 90 MB! Quando spengo questa opzione la dimensione è ridotta a 24 MB. Questa libreria contiene centinaia di classi generate con proto-buffer.L'attivazione dell'intero programma di ottimizzazione in alcune librerie statiche aumenta drasticamente le dimensioni della libreria!

Mi chiedo perché questa opzione aumenta le dimensioni? In quali condizioni dobbiamo spegnerlo?

Edit: cambiato MO a MB grazie chrisaycock

+2

"MO"? Intendi "MB"? – chrisaycock

+3

MO = Mega Octet, non vedo alcun problema. – Clifford

+0

Considerando le risposte fornite, prova a collegare la libreria a un eseguibile che utilizza un numero di classi; Scoprirai che la dimensione del file della libreria fa poca o nessuna differenza rispetto alla dimensione dell'eseguibile. La libreria contiene informazioni per consentire l'ottimizzazione al momento del collegamento. – Clifford

risposta

16

L'ottimizzazione di tutto il programma significa che le cose non sono ottimizzate fino alla fase di collegamento.

La dimensione di una libreria statica non è la cosa da guardare. Quando in questa modalità, la libreria statica può essere piena di informazioni aggiuntive necessarie per l'ottimizzazione finale/fase di collegamento. Se non si stesse eseguendo l'ottimizzazione dell'intero programma, è possibile che tali informazioni siano state gettate dopo che la libreria statica è stata creata, ma quando si è obbligati a conservare tali informazioni fino alla fine.

Cerca invece la dimensione del file eseguibile finale. (Può ancora aumentare, ma non dovrebbe aumentare di un importo così grande.)

4

attivazione di ottimizzazione dell'intero programma consente linker inline funzioni definite in applicazione (*) cpp file. Inlining la stessa funzione in molti posti può aumentare significativamente la dimensione binaria.

7

Mi chiedo perché questa opzione aumenta le dimensioni?

Poiché si sta creando una libreria statica, non un eseguibile. L'ottimizzazione di tutto il programma lascia molta ottimizzazione fino al tempo di collegamento (anziché a tempo di compilazione). Pertanto, la tua libreria contiene "rappresentazioni intermedie" non ottimizzate piuttosto che codice assembly.

In quali condizioni è necessario disattivarlo ?

Per le librerie statiche, come appena scoperto.

+0

Non vedo alcun motivo per disabilitare l'ottimizzazione per le librerie statiche. Le loro dimensioni non contano molto. – Athari

+0

@Athari Non è un problema di dimensioni; è una compatibilità. Vedere l'ultimo paragrafo in http://blogs.msdn.com/b/vcblog/archive/2009/02/24/quick-tips-on-using-whole-program-optimization.aspx – chrisaycock

+3

L'articolo parla di librerie statiche intendi spedire ad altri che potrebbero collegarli ai loro progetti usando una versione del compilatore diversa. Disattivare la WPO in quel caso ha senso per ragioni di compatibilità, ma se le librerie sono solo per uso interno, con la stessa versione del compilatore, allora WPO dovrebbe andare bene e può essere utile.(Se non lo fosse, dubito che l'opzione esisterebbe affatto per le librerie statiche.) –