Wszystkie kompilatory C ++ mają jeden poważny problem z wydajnością. Kompilowanie kodu C ++ jest długim, wolnym procesem.
Kompilowanie nagłówków zawartych w plikach C ++ jest bardzo długim i wolnym procesem. Kompilowanie ogromnych struktur nagłówków, które tworzą część Windows API i innych dużych bibliotek API jest bardzo , bardzo długim i wolnym procesem. To, że trzeba to robić w kółko, w kółko dla każdego pojedynczego pliku źródłowego Cpp, jest zapowiedzią śmierci.
Nie jest to unikalne dla systemu Windows, ale stary problem, z którym zmagają się wszystkie kompilatory, które muszą się kompilować z dużym interfejsem API, takim jak Windows.
Kompilator Microsoft może rozwiązać ten problem za pomocą prostej sztuczki zwanej wstępnie skompilowanymi nagłówkami . Sztuczka jest całkiem sprytna: chociaż każdy plik CPP może potencjalnie i prawnie nadać nieco nieco znaczenie łańcuchowi plików nagłówkowych znajdujących się na wierzchu każdego pliku Cpp (np. Poprzez różne makra #definiowane przed załącznikami lub przez włączenie nagłówków w innej kolejności), najczęściej tak nie jest. Zazwyczaj mamy dziesiątki lub setki dołączonych plików, ale wszystkie mają mieć takie samo znaczenie dla wszystkich plików Cpp kompilowanych w Twojej aplikacji.
Kompilator może znacznie zaoszczędzić czas, jeśli nie będzie musiał zaczynać kompilacji każdego pliku Cpp, a jego dziesiątki dołączonych dosłownie za każdym razem.
Sztuczka polega na wyznaczeniu specjalnego pliku nagłówka jako punktu początkowego wszystkich łańcuchów kompilacji, tak zwanego pliku „prekompilowanego nagłówka”, który zwykle jest plikiem o nazwie stdafx.h ze względów historycznych.
Po prostu wypisz wszystkie swoje wielkie, ogromne nagłówki dla swoich interfejsów API w pliku stdafx.h, w odpowiedniej kolejności, a następnie uruchom każdy z plików CPP na samej górze z #include "stdafx.h"
, przed jakąkolwiek znaczącą treścią (prawie jedyną dozwoloną wcześniej rzeczą jest komentarze).
W tych warunkach, zamiast zaczynać od zera , kompilator zaczyna kompilować od już zapisanych wyników kompilacji wszystkiego stdafx.h
.
Nie wierzę, że ta sztuczka jest unikalna dla kompilatorów Microsoft, ani nie uważam, że była to oryginalna wersja.
Dla kompilatorów firmy Microsoft, ustawienia, które kontroluje wykorzystanie prekompilowanymi nagłówków jest kontrolowany przez argument wiersza poleceń dla kompilatora: /Yu "stdafx.h"
. Jak możesz sobie wyobrazić, użycie stdafx.h
nazwy pliku jest po prostu konwencją; możesz zmienić nazwę, jeśli chcesz.
W Visual Studio 2010 to ustawienie jest kontrolowane z GUI poprzez kliknięcie prawym przyciskiem myszy projektu CPP, wybranie „Właściwości” i przejście do „Właściwości konfiguracji \ C / C ++ \ Prekompilowane nagłówki”. W przypadku innych wersji programu Visual Studio lokalizacja w interfejsie GUI będzie inna.
Pamiętaj, że jeśli wyłączysz prekompilowane nagłówki (lub uruchomisz projekt za pomocą narzędzia, które ich nie obsługuje), nie spowoduje to, że twój program będzie nielegalny; oznacza to po prostu, że Twoje narzędzie za każdym razem kompiluje wszystko od zera.
Jeśli tworzysz bibliotekę bez zależności systemu Windows, możesz łatwo skomentować lub usunąć #include
s z stdafx.h
pliku. Nie ma potrzeby usuwania pliku jako takiego, ale oczywiście możesz to zrobić, wyłączając powyższe ustawienie nagłówka prekompilacji.