2009-08-27 7 views

Odpowiedz

10

Jedyne potencjalne korzyści dla nagłówków prekompilowanymi jest to, że jeśli buduje się zbyt wolno, nagłówki Prekompilowane może przyspieszyć je. Potencjalne minusy:

  • Więcej zależności Makefile, aby uzyskać prawo; jeśli się mylą, szybko budujesz niewłaściwą rzecz. Niedobrze.

  • Zasadniczo nie każdy nagłówek może być prekompilowany. (Pomyśl o umieszczeniu niektórych # definicji przed #include.) Więc jakie przypadki rzeczywiście mają prawa gcc? Jak bardzo chcesz zaufać tej opływającej krawędzi funkcji.

Jeśli urządzenie opiera się na tyle szybko, nie ma powodów, by używać skompilowane nagłówki. Jeśli buduje się zbyt wolno, Pomyślę

  • Zakup szybszego sprzętu, który jest tani w porównaniu do wynagrodzeń

  • stosując narzędzia takie jak AT & T nmake lub jak ccache (Dirk jest tuż nad) , z których obie używają godnych zaufania technik, aby uniknąć ponownej kompilacji.

+3

Właściwie gcc obsługuje PCH całkiem dobrze. Jeśli istnieje #define przed dołączeniem pch, pch jest po prostu nieużywane i używane są normalne. Możesz również rozważyć aktualizację siebie, PCH istnieje już od około pięciu lat w gcc i nie jest już dokładnie krwawieniem. – hirschhornsalz

+0

Oprócz cache'a można również użyć distcc na wielu komputerach. –

+0

@drhirsch: Jestem ostrożnym użytkownikiem gcc. Za każdym razem, gdy pojawi się nowe wydanie, coś się zepsuje. Dla mnie pięć lat wciąż jest krwawieniem. –

5

Interfejs buforowania ccache do gcc, g ++, gfortran, ... działa doskonale dla mnie. Na jego stronie internetowej znajduje się

ccache to pamięć podręczna kompilatora. Działa jako kompilator buforujący do kompilatorów C/C++ , używając przełącznika -E kompilator i mieszania, aby wykryć, kiedy kompilacja może być spełniona z pamięci podręcznej . Powoduje to często przyspieszenie od 5 do 10 razy w zwykłych kompilacjach.

Na Debian/Ubuntu, wystarczy zrobić 'apt-get install ccache' i tworzyć miękkie linków, powiedzmy, /usr/local/bin z nazwami gcc, g++, gfortran, c++ ... tego punktu do /usr/bin/ccache.

[EDIT] Aby to bardziej wyraźne w odpowiedzi na niektórych wczesnych komentarzy: Zapewnia to zasadniczo wstępnie skompilowana nagłówki i źródeł poprzez buforowanie większy kawałek etapie kompilacji. Wykorzystuje więc pomysł podobny do wstępnie skompilowanych nagłówków i przenosi go dalej. Przyspieszenia mogą być dramatyczne - współczynnik 5 do 10, jak podaje witryna.

+6

-1: Nie jestem pewien, czy ma to coś wspólnego ze wstępnie skompilowanymi nagłówkami. – quamrana

+6

Nie ma to nic wspólnego z prekompilowanymi nagłówkami. –

+3

@Martin: Po prostu powoduje, że prekompilowane nagłówki są bezużyteczne. Przyspiesza kompilację, nawet bez wstępnie skompilowanych nagłówków. – elcuco

8

Nie mogę rozmawiać z GNU/gcc/linux, ale ja już do czynienia ze wstępnie skompilowana nagłówków w VS2005:

Plusy:

  • ratuje skompilować czasu, gdy masz duże nagłówki wiele modułów zawierają.
  • Działa dobrze w nagłówkach (np. Od strony trzeciej), które zmieniają się bardzo rzadko, rzadko .

Wady:

  • Jeśli używasz ich do nagłówków, które zmieniają wiele, może zwiększyć czasie kompilacji.
  • Może być kłopotliwy w konfiguracji i obsłudze.
  • Istnieją przypadki, w których zmiany w nagłówkach są najwyraźniej ignorowane , jeśli nie zmusisz skompilowanego nagłówka do kompilacji.
+0

OP pyta o GNU/Linux. –

+7

Mimo to, pro i cons mają również zastosowanie do gcc. –

4

Dla zwykłego C uniknęłabym skompilowanych nagłówków. Jak mówisz, mogą one potencjalnie powodować problemy, a czas przetwarzania jest naprawdę mały w porównaniu do zwykłej kompilacji.

Dla prekompilowanych nagłówków C++ potencjalnie można zaoszczędzić sporo czasu, ponieważ nagłówki C++ często zawierają duży kod szablonu, którego kompilacja jest droga. Nie mam z nimi praktycznego doświadczenia, więc zalecam mierzenie, ile oszczędności w kompilacji dostaniesz w swoim projekcie.Aby to zrobić, skompiluj cały projekt z prekompilowanymi nagłówkami jeden raz, a następnie usuń pojedynczy plik obiektu i zmierzyć czas potrzebny na przekompilowanie tego pliku.

0

Używam PCH w projekcie Qt, który używa cmake jako systemu kompilacji i oszczędza dużo czasu. Chwyciłem niektóre skrypty cmake PCH, które wymagały pewnych poprawek, ponieważ były dość stare, ale generalnie łatwiej było je skonfigurować niż się spodziewałem. Muszę dodać, że nie jestem ekspertem od cmake.

jestem teraz w tym dużą część Qt (QtCore, QtGui, QtOpenGL) i kilka stabilnych nagłówków jednocześnie.

Plusy:

  • Dla klas Qt, nie ma terminowe deklaracje są potrzebne, no i oczywiście nie obejmuje.
  • Szybko.
  • Łatwy w instalacji.

Wady:

  • Nie może zawierać PCH to w nagłówkach. Nie stanowi to większego problemu, poza tym, że używasz Qt i niech system kompilacji tłumaczy pliki moc, co jest dokładnie moją konfiguracją. W tym przypadku musisz # dołączyć nagłówki qt do nagłówków, ponieważ moce są genretowane z nagłówków. Rozwiązanie polegało na umieszczeniu dodatkowej osłony wokół #include w nagłówku.
+0

Od prawie każdego, z kim rozmawiałem, "Łatwy w konfiguracji" jest tak daleko od konsensusu, jak tylko możesz. Czy możesz rozwinąć? – Catskul

+0

Przepraszamy, ale nie mogę sformatować komentarzy, więc jest on zapakowany. W CMakeLists.txt dodałem dwa wiersze "include (PCHSupport)" i "ADD_PRECOMPILED_HEADER (myprojectname $ {CMAKE_SOURCE_DIR} /pch.h)". W plikach implementacji projektu używam "#include " na początku. Ze względu na zalety systemów budowania qt za pomocą automoc, muszę włączyć pch.h w nagłówkach, to działa z dodatkowymi strażnikami. To ostatnie było najtrudniejsze do wymyślenia, ale pracowałem w niecałą godzinę, więc uważam to za "łatwe". – hirschhornsalz

4

omawia możliwe pułapki ze wstępnie skompilowanymi nagłówkami.

Powiązane problemy