Co to jest format pliku PCH?
Plik .pch to skompilowany nagłówek - binarna pamięć podręczna kompilatora generowana automatycznie podczas procesu budowania. Zamiast ponownego analizowania dużych plików nagłówkowych, takich jak Windows SDK czy stdafx.h w każdej jednostce kompilacji, kompilator serializuje swój stan wewnętrzny - tablice symboli, węzły AST, definicje makr, flagi include-guard - do migawki .pch. Kolejne jednostki kompilacji ładują tę migawkę bezpośrednio, co drastycznie skraca czas budowania dużych projektów C i C++.
MSVC tworzy pliki .pch za pomocą flagi kompilatora /Yc, zazwyczaj z dedykowanego pliku źródłowego o nazwie pch.cpp lub stdafx.cpp. Clang przechowuje swoje skompilowane nagłówki jako skompresowany strumień bitowy LLVM osadzony wewnątrz natywnego pliku obiektowego w sekcji o nazwie __clangast. Odpowiednik w GCC używa rozszerzenia .gch zamiast .pch.
Format ten jest całkowicie wewnętrzny dla kompilatora - zastrzeżony, binarny i nieprzenoszalny między maszynami. Plik .pch traci ważność za każdym razem, gdy zmienia się wersja kompilatora, flagi kompilacji lub jakikolwiek dołączony nagłówek; system budowania regeneruje go automatycznie. Typowe rozmiary wahają się od 10 MB do ponad 200 MB, gdy dołączone są nagłówki Windows SDK.
Użytkownicy nigdy nie tworzą ani nie otwierają plików .pch ręcznie. Usunięcie go jest bezpieczne - następne budowanie go odtworzy, a czysta rekompilacja (clean rebuild) jest standardowym rozwiązaniem w przypadku uporczywych błędów związanych z PCH. Moduły C++20 częściowo zmniejszają zależność od skompilowanych nagłówków w nowych bazach kodu, ale .pch pozostaje dominującym mechanizmem przyspieszania kompilacji w istniejących projektach C i C++.
Bezpieczeństwo
RYZYKO: LOWPlik .pch jest wewnętrznym artefaktem budowania kompilatora. Nie może uruchamiać kodu i nie jest wykonywany przez system operacyjny. Brak istotnego wektora ataku; plik jest generowany lokalnie przez system budowania i jest specyficzny dla maszyny.
Szczegóły formatu
w pigułce- Apple Xcode Prefix Header - Xcode (sprzed ery Swift) używał nagłówka prefiksu .pch (plik źródłowy, nie binarny) do wstępnej kompilacji nagłówków Objective-C; koncepcja jest ta sama, ale plik jest nagłówkiem tekstowym, a nie binarnym wynikiem.
Programy otwierające pliki PCH
Szczegóły techniczne
specyfikacja| Typ pliku | Binarna pamięć podręczna kompilatora (zserializowane AST i stan symboli) |
| Kodowanie | Binarne (wewnętrzna reprezentacja kompilatora) |
| Kolejność bajtów | Little-endian (MSVC na x86/x64); zależna od celu (Clang) |
| Kontener | Zastrzeżony binarny blob (MSVC); plik obiektowy COFF/ELF/Mach-O z osadzoną sekcją __clangast (Clang) |
| Kompresja | Brak (MSVC); skompresowany strumień bitowy LLVM, oparty na zlib (Clang) |
| Typowy rozmiar | 10 MB - 200 MB; PCH dla Windows SDK zwykle 50-200 MB |
| Flaga generowania MSVC | /Yc tworzy PCH; /Yu używa go w kolejnych jednostkach kompilacji |
| Domyślny plik źródłowy | stdafx.cpp lub pch.cpp w projektach MSVC |
| Specyficzność maszyny | Nieprzenoszalny między maszynami; MSVC PCH zawiera informacje o adresach specyficzne dla hosta |
| Unieważnienie | Automatycznie regenerowany przy zmianie wersji kompilatora, flag lub dowolnego dołączonego nagłówka |
| Odpowiednik GCC | Rozszerzenie .gch (skompilowane nagłówki GCC nie używają .pch) |
| Wykrywanie wersji | MSVC osadza wewnętrzną sygnaturę; odrzuca nieaktualne pliki PCH przy niezgodności wersji lub flag |
| Następca w C++20 | Moduły C++20 (.ifc w MSVC) częściowo zastępują PCH w nowych bazach kodu |
| Powiązany system operacyjny | Windows (MSVC), macOS (Xcode i Clang), Linux (Clang i GCC) |
| Wydano | 1988 (Microsoft C Compiler 6.0 for MS-DOS, first PCH implementation); mainstream adoption with MSVC for Windows in the 1990s |
| Najnowsza wersja | N/A - format is internal per compiler; MSVC PCH is regenerated by each compiler version |
| Specyfikacja | learn.microsoft.com |
Pytania i odpowiedzi społeczności
pytania użytkownikówBrak pytań - bądź pierwszą osobą, która zapyta o pliki PCH.