Wstępnie skompilowane nagłówki (PCH) to specjalne pliki, które niektóre kompilatory mogą generować dla pliku .cpp. To, czym one są, to: wstępnie skompilowany kod źródłowy. Są to kod źródłowy, który został załadowany przez kompilator i wbudowany w format zależny od kompilatora.
PCH są powszechnie używane do przyspieszenia kompilacji. Możesz umieścić powszechnie używane nagłówki w PCH, a następnie dołączyć PCH. Gdy wykonasz numer #include
na PCH, Twój kompilator nie wykona zwykłej pracy z #include. Zamiast tego ładuje te wstępnie skompilowane symbole bezpośrednio do kompilatora. Bez uruchamiania preprocesora C++. Nie działa kompilator C++. Nie # z milionem różnych plików. Jeden plik jest ładowany, a symbole pojawiają się w pełni uformowane bezpośrednio w obszarze roboczym kompilatora.
Wspominam o tym wszystkim, ponieważ moduły są PCH w ich idealnym formularzu. PCH to w zasadzie gigantyczny hack zbudowany na systemie, który nie pozwala na faktyczne moduły. Celem modułów jest ostatecznie umożliwienie pobrania pliku, wygenerowanie pliku modułu specyficznego dla kompilatora, który zawiera symbole, a następnie kilka innych plików ładuje ten moduł w razie potrzeby. Symbole są wstępnie skompilowane, więc znowu nie ma potrzeby, aby # zawierać kilka rzeczy, uruchamiać kompilator, itp. Twój kod mówi, import thing.foo
i pojawia się.
Zobacz wszystkie nagłówki standardowych bibliotek pochodnych STL. Weźmy na przykład <map>
. Szanse są dobre, że ten plik jest albo gigantyczny, albo ma wiele #inclusions innych plików, które sprawiają, że wynikowy plik jest gigantyczny. To dużo analizowania w C++, które musi się wydarzyć. To musi się zdarzyć dla każdego pliku, który zawiera #include <map>
. Za każdym razem, gdy kompilujesz plik źródłowy, kompilator musi przekompilować to samo. Koniec. I koniec. I znowu.
Czy <map>
zmienia się między kompilacjami? Nie, ale twój kompilator nie może tego wiedzieć. Musi więc kontynuować rekompilację.Za każdym razem, gdy dotykasz pliku .cpp, musisz skompilować każdy nagłówek, który zawiera ten plik .cpp. Nawet jeśli nie dotknąłeś tych nagłówków ani plików źródłowych, które mają wpływ na te nagłówki.
Pliki PCH były sposobem na obejście tego problemu. Ale są ograniczone, bo to tylko hack. Możesz dołączyć tylko jeden plik .cpp, ponieważ musi to być pierwsza rzecz dołączona przez pliki .cpp. A ponieważ istnieje tylko jeden PCH, jeśli zrobisz coś, co zmienia PCH (jak dodaj do niego nowy nagłówek), musisz przekompilować wszystko, co w tym PCH.
Moduły zasadniczo nie mają nic wspólnego z kompilatorem krzyżowym ABI (chociaż jedno z nich byłoby miłe, a moduły uczyniłyby go nieco prostszym). Ich podstawowym celem jest przyspieszenie czasów kompilacji.
Zasadniczy cel wykracza poza samo przyspieszenie czasu kompilacji .....: D –