2011-09-06 20 views
9

Ogni volta che compiliamo un file C++, viene generato un file obj. Voglio sapere che su quali fattori dipende la dimensione del file obj?Da cosa dipende la dimensione di un file oggetto C++?

Giusto per rendere più chiara la mia domanda, Ad esempio un file C++ contiene una dichiarazione di classe e questa classe ha 1 variabile intera come membro dati e ha anche alcune funzioni membro. Se compilo questo file, verrà creato un file obj di dimensioni X. Supponiamo ora di aggiungere più membri di dati e funzioni membro, quindi la dimensione del file obj cambierà?

+3

Non tenterei di trarre alcuna conclusione tra la dimensione del file "obj" e la dimensione della dimensione dell'oggetto (memoria). Che cosa stai cercando di ottenere? –

+0

Qui mi interessa la dimensione del file obj perché so che la dimensione dell'oggetto dipenderà dai membri dei dati che ha. Ma puoi dirmi che su quali fattori dipende la dimensione del file obj?In realtà mi è stato chiesto in un'intervista così volevo sapere la risposta. –

risposta

10

Ciò dipende da un milione di fattori diversi ed è interamente dipendente dalla piattaforma, dal compilatore e dalle impostazioni.

Il file oggetto deve contenere tutto il gruppo per i corpi delle funzioni per le funzioni con collegamento esterno, nonché tutte le variabili globali con collegamento esterno. Qualunque cosa abbia un collegamento interno può o meno garantire una voce separata nel file oggetto, in quanto potrebbero essere state ottimizzate e integrate direttamente nel loro sito di chiamata. Questo dipende fortemente dalle impostazioni di ottimizzazione.

GCC ha anche un'opzione per "ottimizzazioni del tempo di collegamento" che essenzialmente aggiunge una copia dell'intero codice sorgente al file oggetto e ne aumenta drasticamente le dimensioni.

I simboli di debug aggiungono anche molti dati aggiuntivi.

Per la tua domanda specifica per C++: una definizione di classe non è realmente visibile nell'assembly. Le funzioni membro non in linea sono solo più funzioni che devono essere compilate, mentre i membri dati sono trattati come i dati primitivi - saranno nello stack di chiamate se dichiarano istanze di quel tipo, ma non direttamente influire sul codice assembly ... a meno che tu non stia inizializzando le cose con costanti; le costanti entrano nel codice, ovviamente.

+0

Grazie mille Kerrek. –

3

Il file oggetto contiene (tra gli altri) il codice macchina dopo che la sorgente è stata compilata, ma prima che sia collegata. La dimensione del file oggetto dipende quindi essenzialmente dalla complessità del codice.

La maggior parte dei compilatori offre la possibilità di aggiungere simboli di debug durante la compilazione per semplificare il debug, ma aumenterà la dimensione del file oggetto. È possibile aggiungere i simboli di debug con l'opzione -g e contrassegnarli con l'opzione -s in GCC. Visual Studio ha qualcosa di simile.

2

È fortemente dipendente dal compilatore, ma.

Il file oggetto conterrà codice eseguibile, stub di collegamento e metadati. I metadati possono essere qualsiasi cosa dipendente dal compilatore, quindi è fuori questione - tutto può succedere a seconda di cosa pensa il compilatore. Gli stub di collegamento vengono creati per tutte le entità con collegamento esterno e per tutti i riferimenti in uscita a entità in altri file oggetto, che non sono direttamente interessati dall'aggiunta di membri nella classe nello stesso file oggetto.

Ora per codice. Quando si aggiunge una variabile membro, questa deve essere costruita e distrutta - ciò richiederà un costruttore e un distruttore che potrebbero essere banali o meno. Se non sono banali, ciò porterà a una leggera crescita delle dimensioni del codice, poiché ora è necessario fare qualcosa in più per gestire tali variabili membro e che richiede un codice aggiuntivo.

Problemi correlati