2013-03-14 8 views
6

Per un programma scritto in C++, ho bisogno di due enormi matrici di stringhe che contengono dati.C++ (gcc/g ++) Due enormi matrici di stringhe impiegano molto tempo per compilare

Essi sono definiti in un file di intestazione come segue:

#include <string> 
static const string strdataA[30000]={"this is the first line of the data", 
    "the second line of data", 
    "other stuff in the third line", 

verso il basso per

"last line."}; 
//second array strings 
static const string strdataB[60000]={"this is the first line of the data", 
    "the second line of data", 
    "other stuff in the third line", 

verso il basso per

"last line."}; 

Ma quando compilo questo con g ++, ci vuole tanto lungo che non l'ho visto completo. Utilizza anche circa due GB di memoria virtuale. Così ho commentato strdataB [], e poi il programma è stato compilato, ma ancora dopo molto tempo. L'eseguibile era solo di circa 8 Mb e funzionava bene.

Cosa posso fare per accelerare la procedura di compilazione? Non mi importa se devo cambiare il codice, ma non voglio usare un file esterno da cui caricare. Mi piacerebbe un array perché funziona molto bene per me all'interno del programma.

Ho letto sulla rete da qualche parte che "stat const" dovrebbe fare il trucco, ma ho imparato per esperienza che non è così.

Grazie mille in anticipo per qualsiasi suggerimento!

+0

Di quante linee stai parlando? Ci sono davvero 30.000 e 60.000 stringhe nella tua fonte? –

+1

Presumo che siano in un file sorgente non in un file di intestazione. –

+0

Ti rendi conto che il caricatore deve fare praticamente lo stesso come faresti se caricassi le stringhe da un file esterno? –

risposta

6

Non è necessario utilizzare std::string per quello. Utilizzare invece pianura vecchio const char*:

const char * const strdataA[30000] = { 
    "one", 
    "two", 
    //... 
}; 

Il static parola chiave non dovrebbe fare molta differenza qui.

In questo modo, le stringhe verranno archiviate nella sezione di dati di sola lettura come valori letterali semplici e l'array stesso sarà semplicemente una serie di puntatori. Inoltre, si evita di eseguire i costruttori/distruttori delle stringhe in fase di esecuzione.

+0

Questo ha fatto davvero il trucco, che ora compila in un batter d'occhio. Grazie! –

3

Credo che questi siano problemi noti in GCC. Non dici quale versione di GCC stai usando, forse dovresti provare con la nuova versione stabile di GCC, per vedere se migliora o non migliora le cose.

Probabilmente non dovresti tenere tutta la tua stringa nel codice sorgente. Probabilmente dovresti caricarli da file esterni all'avvio o simili.

+0

Concordato, mantenendo le stringhe esterne e caricando all'avvio il programma è molto più facile da modificare . Ciò richiede la modifica del codice per correggere errori di battitura in una stringa. –

+0

@ Chris.Stover In generale, sono d'accordo con entrambi. Tuttavia, se per esempio stai memorizzando lo schema del tuo file di configurazione nel tuo codice sorgente, allora penserei che sia stata una buona idea per motivi di sicurezza. –

+0

gcc --version fornisce "gcc (Ubuntu/Linaro 4.7.2-11lucid3) 4.7.2", l'ultima che potrei ottenere. File di dati esterni/database potrebbero essere una soluzione, ma voglio solo un singolo file eseguibile, non diversi. –

1

Cosa posso fare per accelerare la procedura di compilazione?

const char* strdataA ... dovrebbe accelerare il processo di compilazione. Perché nella tua versione attuale g ++ deve creare un elenco enorme di chiamate del costruttore per ogni singola stringa.

+0

Grazie, questa è davvero la soluzione. –