Domanda

Sto lavorando a un programma C ++ e il codice oggetto compilato da un singolo file di 1200 righe (che inizializza una macchina a stati piuttosto complessa) arriva a quasi un megabyte. Cosa potrebbe rendere il file così grande? C'è un modo per trovare ciò che occupa spazio all'interno del file oggetto?

È stato utile?

Soluzione

Ci possono essere diversi motivi per cui i file oggetto sono più grandi di quanto devono essere almeno:

  • incluse staticamente le librerie dipendenti
  • costruendo con informazioni di debug
  • costruendo con informazioni di profilazione
  • creazione di strutture di dati (estremamente) complesse utilizzando modelli (forse strutture di boost ricorsive)
  • non attivare l'ottimizzazione dei flag durante la compilazione (non risparmia molto e può causare difficoltà se utilizzato in modo eccessivo)

In un primo momento suggerisco di verificare se stai costruendo con le informazioni di debug, questo provoca il maggior gonfiamento della mia esperienza.

Altri suggerimenti

(Suppongo che tu abbia attivato l'ottimizzazione e lo stripping del codice morto).

Attiva il " del tuo linker; genera il file della mappa " opzione ed esaminare l'output.

I colpevoli comuni sono macro / modelli che producono grandi quantità di codice e grandi oggetti globali.

Forse alcune istanze di template (specialmente le std::iostream s), e forse un approfondimento (cioè classi che sono completamente definite in un'intestazione). Tuttavia, qual è il problema con un file oggetto da 1 megabyte in primo luogo? Durante il collegamento, potrebbe benissimo risultare in un piccolo binario. Ho un progetto qui con 20 MiB di file oggetto che viene collegato ad esempio in un binario da 700 KiB.

Aggiornamento: potrebbe essere anche un array / oggetto statico di grandi dimensioni. Oltre a ciò, con MSVC ++ e GCC, puoi guardare l'assembly generato per un file, che può darti alcuni suggerimenti (con GCC, è g++ -S foo.cpp, per MSVC ++, è '/ FAs' ). O vedrai molte di istanze di template, quindi queste sono le ragioni. In caso contrario, è la dimensione dell'oggetto di static oggetti.

Un altro possibile motivo è Link-Time Code Generation, un'opzione VC ++. Questo sposta il backend del compilatore nel linker. Ciò consente migliori ottimizzazioni, ma ora il file oggetto deve contenere tutte le strutture dati interne normalmente passate tra front-end e back-end.

Ecco una macro che uso per visualizzare i valori del tempo di compilazione:

template <size_t N> struct compile_time_number { private: typedef int check; };
#define compiler_check_number(N) ((compile_time_number< N >::check)0)

Quindi vai felice durante la compilazione per vedere quali simboli occupano spazio.

Modifica: poiché nessuno sembra capirlo, chiarirò: il modo di usarlo è aggiungere compiler_check_number(sizeof(<insert struct or global variable here>)). Il compilatore sputerà la dimensione della variabile o struttura come errore di tempo di compilazione. Molto raramente il codice è la ragione di un enorme file oggetto.

Lo uso sempre per vedere quanto sono grandi le cose senza dover eseguire un debugger.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top