Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V minulosti byste standardní knihovnu zahrnuli direktivou jako #include <vector>. 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. Soubory hlaviček zpomalují kompilaci. 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 jako moduly, pokud jsou dobře strukturované. 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ě může být 250megabajtový soubor PCH reprezentován souborem hlavičky o velikosti 80 megabajtů. |
| 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 hlavičkové jednotky o velikosti 80 megabajtů, což může být reprezentováno modulem o velikosti 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: Vytváření a import jednotek hlaviček v projektech Microsoft C++