Sdílet prostřednictvím


Porovnání jednotek hlaviček, modulů a předkompilovaných hlaviček

V minulosti byste zahrnuli standardní knihovnu s direktivou, jako #include <vector>je . Zahrnutí souborů hlaviček je ale nákladné, protože jsou znovu zpracovány každým zdrojovým souborem, který je obsahuje.

Předkompilované hlavičky (PCH) byly zavedeny pro urychlení kompilace jejich překládáním jednou a opětovným použitím výsledku. Předkompilované hlavičky ale můžou být obtížné udržovat.

V jazyce C++20 byly moduly zavedeny jako významné vylepšení hlavičkových souborů a předkompilovaných hlaviček.

Jednotky hlaviček byly zavedeny v jazyce C++20 jako způsob, jak dočasně překlenout mezeru mezi soubory hlaviček a moduly. Poskytují některé výhody rychlosti a robustnosti modulů, zatímco migrujete kód na použití modulů.

Standardní knihovna C++23 pak zavedla podporu importu standardní knihovny jako pojmenovaných modulů. Jedná se o nejrychlejší a nej robustnější způsob, jak využívat standardní knihovnu.

Abychom vám pomohli seřadit různé možnosti, tento článek porovnává tradiční #include metodu s předkompilovanými hlavičkami, jednotkami záhlaví a importem pojmenovaných modulů.

Následující tabulka je uspořádaná podle rychlosti a odolnosti kompilátoru, která #include je nejpomalejší a nejméně robustní a import je nejrychlejší a nej robustnější.

metoda Shrnutí
#include Nevýhodou je, že zpřístupňují makra a interní implementaci. Interní implementace je často vystavena jako funkce a typy, které začínají podtržítkem. To je konvence, která označuje, že něco je součástí interní implementace a nemělo by se používat.

Soubory hlaviček jsou křehké, protože pořadí #includes může změnit chování nebo přerušit kód a jsou ovlivněny definicemi maker.

Pomalé kompilace souborů hlaviček Zvláště pokud stejný soubor obsahuje více souborů, protože se soubor hlavičky několikrát znovu zpracuje.
Předkompilovaná hlavička Předkompilovaná hlavička (PCH) zlepšuje dobu kompilace vytvořením snímku paměti kompilátoru sady souborů hlaviček. Jedná se o vylepšení opakovaného opětovného sestavení souborů hlaviček.

Soubory PCH mají omezení, která ztěžují jejich údržbu.

Soubory PCH jsou rychlejší, než #include ale pomalejší než import.
Jednotky záhlaví Jedná se o novou funkci v jazyce C++20, která umožňuje importovat soubory hlaviček dobře se chovají jako moduly.

Jednotky hlaviček jsou rychlejší než #includea snadněji se udržují, výrazně menší a také rychlejší než předkompilované hlavičkové soubory (PCH).

Jednotky hlaviček jsou "mezi" krok, který má pomoct s přechodem na pojmenované moduly v případech, kdy spoléháte na makra definovaná v souborech hlaviček, protože pojmenované moduly nezpřístupňují makra.

Jednotky záhlaví jsou pomalejší než import pojmenovaného modulu.

Jednotky záhlaví nejsou definovány makrem, pokud nejsou určené na příkazovém řádku, pokud je jednotka záhlaví vytvořená tak, aby byla robustnější než soubory hlaviček.

Jednotky záhlaví zpřístupňují makra a interní implementaci definované v nich stejně jako soubor hlaviček, který pojmenované moduly nemají.

Přibližná aproximace velikosti souboru může být 250 megabajtový soubor PCH reprezentován souborem 80 megabajtové jednotky hlaviček.
Moduly Jedná se o nejrychlejší a nej robustnější způsob importu funkcí.

Podpora importu modulů byla zavedena v jazyce C++20. Standardní knihovna C++23 zavádí dva pojmenované moduly popsané v tomto tématu.

Při importu stdzískáte standardní názvy, například std::vector, std::coutale žádná rozšíření, žádné interní pomocné rutiny, například _Sort_uncheckeda žádná makra.

Pořadí importů nezáleží, protože neexistuje žádné makro nebo jiné vedlejší účinky.

Jako přibližnou aproximaci velikosti souboru může být soubor PCH o velikosti 250 megabajtů reprezentován souborem 80 megabajtové jednotky hlavičky, který může být reprezentován modulem 25 megabajtů.

Pojmenované moduly jsou rychlejší, protože když je pojmenovaný modul zkompilován do .ifc souboru a .obj souboru, kompilátor generuje strukturované znázornění zdrojového kódu, které lze rychle načíst při importu modulu. Kompilátor může před generováním .ifc souboru provést nějakou práci (například překlad názvů) z důvodu toho, jak pojmenované moduly jsou nezávislé na pořadí a nezávisle na makrech– takže tato práce se nemusí provádět při importu modulu. Naproti tomu když je soubor záhlaví spotřebován s #include, jeho obsah musí být předzpracován a zkompilován znovu a znovu v každé jednotce překladu.

Předkompilované hlavičky, které jsou snímky paměti kompilátoru, mohou tyto náklady zmírnit, ale ne stejně jako pojmenované moduly.

Pokud ve své aplikaci můžete používat funkce C++20 a standardní knihovnu C++23, použijte pojmenované moduly.

Pokud můžete použít funkce C++20, ale chcete přejít v průběhu času na moduly, použijte prozatím jednotky hlaviček.

Pokud nemůžete používat funkce C++20, použijte #include a zvažte předkompilované hlavičky.

Viz také

Předkompilované soubory hlaviček
Přehled modulů v jazyce C++
Kurz: Import standardní knihovny C++ pomocí modulů
Návod: Import knihoven STL jako jednotek hlaviček
Návod: Sestavení a import jednotek hlaviček v projektech Visual C++