2013-03-14 7 views
6

Dla programu napisanego w C++ potrzebuję dwóch ogromnych tablic ciągów zawierających dane.C++ (gcc/g ++) Dwie ogromne tablice ciągów zajmują wyjątkowo dużo czasu kompilacji

Są one zdefiniowane w pliku nagłówkowym następująco:

#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", 

do

"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", 

do

"last line."}; 

Ale kiedy mogę skompilować to z g ++, to trwa tak długo, że nie widziałem go kompletny. Wykorzystuje również około dwóch GB pamięci wirtualnej. Skomentowałem więc strdataB [], a następnie program się skompilował, ale nadal po dłuższej chwili. Plik wykonywalny miał tylko około 8 Mb i działał dobrze.

Co mogę zrobić, aby przyspieszyć proces kompilowania? Nie mam nic przeciwko, jeśli muszę zmienić kod, ale nie chcę używać zewnętrznego pliku do załadowania. Chciałbym tablicy, ponieważ działa bardzo dobrze dla mnie w programie.

Czytam w sieci gdzieś, że "statyczna konstytucja" powinna załatwić sprawę, ale nauczyłem się z doświadczenia, że ​​tak nie jest.

Bardzo dziękuję z góry za wszelkie sugestie!

+0

Ile linii mówisz? Czy w Twoim źródle jest naprawdę 30 000 i 60 000 ciągów? –

+1

Zakładam, że znajdują się w pliku źródłowym, a nie w pliku nagłówkowym. –

+0

Zdajesz sobie sprawę, że program ładujący musi w zasadzie działać tak samo, jak w przypadku ładowania łańcuchów z zewnętrznego pliku? –

Odpowiedz

6

Do tego nie należy używać std::string. Użyj zamiast zwykłego starego const char*:

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

static słowo kluczowe nie powinny wielkiej różnicy tutaj.

W ten sposób same ciągi będą przechowywane w sekcji danych tylko do odczytu jako proste literały, a sama tablica będzie po prostu tablicą wskaźników. Poza tym unikasz uruchamiania konstruktorów/destruktorów ciągów w środowisku wykonawczym.

+0

To rzeczywiście się udało, teraz kompiluje się w mgnieniu oka. Dzięki! –

3

Uważam, że są to znane problemy w GCC. Nie mówisz, jakiej wersji GCC używasz, może powinieneś spróbować z najnowszą stabilną wersją GCC, aby sprawdzić, czy to działa, czy nie.

Prawdopodobnie nie należy przechowywać wszystkich ciągów znaków w kodzie źródłowym. Powinieneś prawdopodobnie załadować je z zewnętrznego pliku podczas uruchamiania lub innego.

+0

Uzgodniono, utrzymując ciągi zewnętrzne i ładując przy starcie program jest znacznie łatwiejszy do modyfikacji . Wymaga to modyfikacji kodu, aby naprawić literówki w ciągu znaków. –

+0

@ Chris.Stover Ogólnie, zgadzam się z wami obiema. Jeśli jednak na przykład przechowujesz schemat swojego pliku konfiguracyjnego w kodzie źródłowym, to byłby to dobry pomysł ze względów bezpieczeństwa. –

+0

gcc --version daje "gcc (Ubuntu/Linaro 4.7.2-11lucid3) 4.7.2", najnowsze, jakie mogłem uzyskać. Zewnętrzne pliki danych/baza danych mogą być rozwiązaniem, ale chcę tylko jednego pliku wykonywalnego, a nie kilku różnych plików. –

1

Co mogę zrobić, aby przyspieszyć proces kompilowania?

const char* strdataA ... przyspieszyć proces kompilacji. Ponieważ w twojej obecnej wersji g ++ musi tworzyć ogromną listę wywołań konstruktora dla każdego pojedynczego ciągu.

+0

Dzięki, to jest rzeczywiście rozwiązanie. –