Udostępnij za pośrednictwem


Porównanie jednostek nagłówków, modułów i wstępnie skompilowanych nagłówków

W przeszłości należy uwzględnić bibliotekę standardową z dyrektywą, na przykład #include <vector>. Jednak dołączenie plików nagłówków jest kosztowne, ponieważ są one ponownie przetwarzane przez każdy plik źródłowy, który je zawiera.

Wstępnie skompilowane nagłówki (PCH) zostały wprowadzone w celu przyspieszenia kompilacji, tłumacząc je raz i ponownie używając wyniku. Jednak wstępnie skompilowane nagłówki mogą być trudne do utrzymania.

W języku C++20 moduły zostały wprowadzone jako znacząca poprawa plików nagłówków i wstępnie skompilowanych nagłówków.

Jednostki nagłówka zostały wprowadzone w języku C++20 jako sposób tymczasowego wypełnienia luki między plikami nagłówków i modułami. Zapewniają one niektóre korzyści z szybkości i niezawodności modułów podczas migrowania kodu do używania modułów.

Następnie biblioteka standardowa języka C++23 wprowadziła obsługę importowania standardowej biblioteki jako nazwanych modułów. Jest to najszybszy i najbardziej niezawodny sposób korzystania ze standardowej biblioteki.

Aby ułatwić sortowanie różnych opcji, w tym artykule porównano tradycyjną #include metodę z prekompilowanych nagłówków, jednostek nagłówków i importowanie nazwanych modułów.

Poniższa tabela jest ułożona przez szybkość i niezawodność przetwarzania kompilatora, przy #include czym jest najwolniejsza i najmniej niezawodna oraz import jest najszybsza i najbardziej niezawodna.

Method Podsumowanie
#include Jedną z wad jest to, że uwidaczniają makra i implementację wewnętrzną. Implementacja wewnętrzna jest często uwidaczniana jako funkcje i typy rozpoczynające się od podkreślenia. Jest to konwencja wskazująca, że coś jest częścią wewnętrznej implementacji i nie powinno być używane.

Pliki nagłówków są kruche, ponieważ kolejność #includes może modyfikować zachowanie lub przerywać kod i mają wpływ na definicje makr.

Powolne kompiluj pliki nagłówka. Szczególnie wtedy, gdy wiele plików zawiera ten sam plik, ponieważ następnie plik nagłówka jest ponownie przetwarzany wiele razy.
Prekompilowany nagłówek Prekompilowany nagłówek (PCH) poprawia czas kompilacji, tworząc migawkę pamięci kompilatora zestawu plików nagłówkowych. Jest to poprawa wielokrotnego ponownego kompilowania plików nagłówków.

Pliki PCH mają ograniczenia, które utrudniają ich konserwację.

Pliki PCH są szybsze niż #include , ale wolniejsze niż import.
Jednostki nagłówka Jest to nowa funkcja w języku C++20, która umożliwia importowanie plików nagłówków "dobrze zachowywanych" jako modułów.

Jednostki nagłówka są szybsze niż #include, i są łatwiejsze do utrzymania, znacznie mniejsze, a także szybsze niż wstępnie skompilowane pliki nagłówków (PCH).

Jednostki nagłówka są krokiem "między" przeznaczonym do przejścia do nazwanych modułów w przypadkach, gdy korzystasz z makr zdefiniowanych w plikach nagłówkowych, ponieważ nazwane moduły nie uwidaczniają makr.

Jednostki nagłówka są wolniejsze niż importowanie nazwanego modułu.

Jednostki nagłówka nie mają wpływu na definicje makr, chyba że są określone w wierszu polecenia, gdy jednostka nagłówka jest wbudowana, co czyni je bardziej niezawodnymi niż pliki nagłówkowe.

Jednostki nagłówka uwidaczniają makra i implementację wewnętrzną zdefiniowaną w nich tak samo jak plik nagłówkowy, który nazwany moduły nie.

Przybliżone przybliżenie rozmiaru pliku może być reprezentowane przez plik jednostki nagłówka 80 megabajtów 250 megabajtów.
Moduły Jest to najszybszy i najbardziej niezawodny sposób importowania funkcji.

Obsługa importowania modułów została wprowadzona w języku C++20. W standardowej bibliotece języka C++23 wprowadzono dwa nazwane moduły opisane w tym temacie.

Podczas importowania stdprogram uzyskuje standardowe nazwy, takie jak std::vector, std::cout, ale bez rozszerzeń, bez wewnętrznych pomocników, takich jak _Sort_unchecked, i bez makr.

Kolejność importu nie ma znaczenia, ponieważ nie ma makra ani innych skutków ubocznych.

Przybliżone przybliżenie rozmiaru pliku może być reprezentowane przez 80-megabajtowy plik jednostki nagłówka o rozmiarze 25 megabajtów, który może być reprezentowany przez moduł 25-megabajtowy.

Nazwane moduły są szybsze, ponieważ gdy nazwany moduł jest kompilowany w .ifc pliku i .obj pliku, kompilator emituje ustrukturyzowaną reprezentację kodu źródłowego, który można szybko załadować po zaimportowaniu modułu. Kompilator może wykonać pewną pracę (na przykład rozpoznawanie nazw) przed emisją pliku ze względu na sposób, w jaki nazwane moduły są niezależne od kolejności i niezależne od makr — więc ta praca nie musi być wykonywana po zaimportowaniu .ifc modułu. Natomiast gdy plik nagłówka jest używany z #includeprogramem , jego zawartość musi być wstępnie przetworzona i skompilowana ponownie w każdej jednostce tłumaczenia.

Wstępnie skompilowane nagłówki, które są migawkami pamięci kompilatora, mogą ograniczyć te koszty, ale nie także nazwane moduły.

Jeśli możesz użyć funkcji języka C++20 i standardowej biblioteki języka C++23 w aplikacji, użyj nazwanych modułów.

Jeśli możesz użyć funkcji języka C++20, ale chcesz przejść z czasem do modułów, użyj jednostek nagłówka w międzyczasie.

Jeśli nie możesz używać funkcji języka C++20, użyj #include prekompilowanych nagłówków i rozważ ich użycie.

Zobacz też

Pliki prekompilowanego nagłówka
Omówienie modułów w języku C++
Samouczek: importowanie standardowej biblioteki języka C++ przy użyciu modułów
Przewodnik: importowanie bibliotek STL jako jednostek nagłówka
Przewodnik: kompilowanie i importowanie jednostek nagłówków w projektach Visual C++