2013-06-13 8 views
5

La mia domanda è praticamente ripetuta this one, che richiede perché si verifica. Vorrei sapere se è possibile evitarlo.GCC: evitare il collegamento di molto tempo durante l'utilizzo di array statici

La questione è: se io allocare una grande quantità di memoria in modo statico:

unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ]; 

poi linker (ld) prende molto tempo per fare un eseguibile. C'è una buona spiegazione da @davidg su questo comportamento in questione ho dato sopra:

Questo ci lascia con la serie segue di passi:

  1. L'assemblatore dice al linker che ha bisogno di creare una sezione di memoria lunga 1 GB.

  2. Il linker va avanti e alloca questa memoria, in preparazione per inserirla nell'eseguibile finale.

  3. Il linker si rende conto che questa memoria si trova nella sezione .bss ed è contrassegnata da NOBITS, il che significa che i dati sono solo 0 e non devono essere fisicamente inseriti nell'eseguibile finale. Evita di scrivere 1 GB di dati, invece di buttare via la memoria allocata.

  4. Il linker scrive nel file ELF finale solo il codice compilato, producendo un piccolo file eseguibile.

un linker più intelligente potrebbe essere in grado di evitare i punti 2 e 3 di cui sopra, rendendo il tempo di compilazione molto più veloce

Ok. @davidg aveva spiegato perché il plug-in richiede molto tempo, ma voglio sapere come posso evitare . Forse GCC ha alcune opzioni, che dirà al linker allo be a little smarter e allo avoid steps 2 and 3 above?

Grazie.

P.S. Io uso GCC 4.5.2 in Ubuntu

+0

Provare a utilizzare una variabile globale statica. – Claudio

+0

Ho chiarito la tua domanda e il titolo un po ', quindi il lettore non deve leggere direttamente all'ultimo paragrafo per imparare * quale sia la domanda *, o perché non è un duplicato. Spero non ti dispiaccia. :) – jalf

+0

@Claudio I ** ha ** utilizzato una variabile globale statica. – borisbn

risposta

1

È possibile allocare la memoria statica nella versione solo:

#ifndef _DEBUG 
    unsigned char static_data[ 8 * BYTES_IN_GYGABYTE ]; 
#else 
    unsigned char *static_data; 
#endif 
+0

Hmmm. Buona idea, ma ho notevolmente semplificato il mio codice. A questo punto 'static_data' è definito come' MyStruct static_data [ONE_DIMENTION] [TWO_DIMENTION] [THREE_DIMENTION]; 'Sicuramente, posso dichiararlo come' MyStruct *** static_data' e allocare tutte le dimensioni nei loop, ma sono troppo pigro per farlo it))) – borisbn

+0

Avere un'unità di compilazione separata per quei dati dovrebbe anche aumentare il tempo di compilazione, giusto? Voglio dire se metti la struttura in un file c e la compili separatamente? – perreal

+0

No. Ho un enorme ** tempo di collegamento **. Non compilazione. E sì ... questa struttura si trova in un file cpp separato. – borisbn

0

avrei 2 idee in mente che potrebbe aiutare:

  1. Come già menzionato in alcuni commenti: posizionarlo in un'unità di compilazione separata. Ciò non ridurrà il tempo di collegamento. Ma forse con il collegamento incrementale aiuta (opzione ld -r).
  2. Altro è simile. Inseriscilo in un'unità di compilazione separata e genera una libreria condivisa. E basta collegarsi in seguito con la libreria condivisa.

Purtroppo non posso promettere che una delle aiuta, come non ho modo di prova: la mia gcc (4.7.2) e gli strumenti di bin dont mostrare questo comportamento in termini di tempo, 8, 16 o 32 gigabyte testprogram compilare e link in meno di un secondo.

+0

Quando provo ad aggiungere l'opzione '-r' al linker ho il problema simile a questo - http://lists.gnu.org/archive/html/help-gplusplus/2007-01/msg00058.html Come posso vedere è vecchio problema (( – borisbn

+0

@borisbn: Ah stai usando C++, per quanto mi ricordi non dovresti usare -r da solo, ma invece '-Ur', non so se aiuta in questo caso di errore. denaro nell'approccio alla lib condivisa. – flolo

Problemi correlati