Dlaczego warto używać wstępnie skompilowanych nagłówków (C / C++)?

Dlaczego używać wstępnie skompilowanych nagłówków?


Czytając odpowiedzi podejrzewam, że to co z nimi robiłem jest trochę głupie:

#pragma once

// Defines used for production versions

#ifndef PRODUCTION
#define eMsg(x) (x) // Show error messages
#define eAsciiMsg(x) (x)
#else
#define eMsg(x) (L"") // Don't show error messages
#define eAsciiMsg(x) ("")
#endif // PRODUCTION

#include "targetver.h"
#include "version.h"

// Enable "unsafe", but much faster string functions
#define _CRT_SECURE_NO_WARNINGS
#define _SCL_SECURE_NO_WARNINGS

// Standard includes
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <direct.h>
#include <cstring>
#ifdef _DEBUG
#include <cstdlib>
#endif

// Standard Template Library
#include <bitset>
#include <vector>
#include <list>
#include <algorithm>
#include <iterator>
#include <string>
#include <numeric>

// Boost libraries
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/scoped_array.hpp>

//Windows includes
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "FILETIME_Comparisons.h"
#include <shlwapi.h>
#include <Shellapi.h>
#include <psapi.h>
#include <imagehlp.h>
#include <mscat.h>
#include <Softpub.h>
#include <sfc.h>
#pragma comment(lib, "wintrust.lib")
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"Psapi.lib")
#pragma comment(lib,"shlwapi.lib")
#pragma comment(lib,"imagehlp.lib")
#pragma comment(lib,"Advapi32.lib")
#pragma comment(lib,"Shell32.lib")
#pragma comment(lib,"Sfc.lib")
#pragma comment(lib,"Version.lib")

// Crypto ++ libraries
#ifdef _DEBUG
#pragma comment(lib,"cryptlibd.lib")
#else
#pragma comment(lib,"cryptlib.lib")
#endif
#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
#include <md5.h>
#include <sha.h>

// String libraries
#include "stringUnicodeConversions.h"
#include "expandEnvStrings.h"
#include "randomString.h"
#include "getShortPathName.h"

// Regular Expression Libraries
#include "fpattern.h"

// File Result Record
#include "unixTimeToFileTime.h"
#include "fileData.h"

// Writer
#include "writeFileData.h"

// Criteria Structure System
#include "priorities.h"
#include "criterion.H"
#include "OPSTRUCT.H"
#include "regexClass.H"
#include "FILTER.h"

// Sub Programs Root Class
#include "subProgramClass.h"

// Global data
#include "globalOptions.h"

// Logger
#include "logger.h"

// Console parser
#include "consoleParser.h"

// Timeout handler
#include "timeoutThread.h"

// Zip library
#include "zip.h"
#include "unzip.h"
#include "zipIt.h"

// Scanner
#include "mainScanner.h"
#include "filesScanner.h"

// Sub Programs
#include "volumeEnumerate.h"
#include "clsidCompressor.h"
#include "times.h"
#include "exec.h"
#include "uZip.h"

// 64 bit support
#include "disable64.h"
Author: Peter Mortensen, 2009-05-24

5 answers

Kompiluje lot szybciej. Kompilacja C++ trwa lata bez nich. Spróbuj porównać trochę czasu w dużym projekcie!

 42
Author: rlbond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-29 18:05:38

W C/C++ mechanizm #include jest tekstową kopią pliku podanego do bieżącego pliku. Nagłówki zawierają inne nagłówki (które zawierają jeszcze inne nagłówki), więc gdy wykonasz # include, może to być dodanie dziesiątek tysięcy linii C++ do każdego pliku cpp (lub cxx, c, cokolwiek), z których wszystkie muszą być skompilowane za każdym razem. Może to być wąskie gardło dla dużych projektów.

Wstępnie skompilowane nagłówki przyspieszają to przez kompilację każdego nagłówka raz, a następnie włączenie tego skompilowanego stanu do cpp są one zawarte w.

 64
Author: Todd Gardner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-24 06:45:01

Re: twoje obecne użycie, jeśli masz target z bardzo dużą liczbą plików, nadal może być szybsze użycie PCH w ten sposób-spróbuj je wyłączyć, aby się dowiedzieć. To zależy: jeśli masz dużo własnych nagłówków i zmieniasz je tylko rzadko, a masz bardzo dużą liczbę plików źródłowych, które zmieniasz znacznie częściej, to użycie PCH skróci czas odbudowy.

Ale normalną radą jest umieszczanie w PCH tylko rzeczy, które nigdy się nie zmieniają, ponieważ jest pewna nad głową do produkcji samego PCH. Jeśli uruchomisz to przy każdej przebudowie (przez ciągłe poprawianie jednego z nagłówków), użycie PCH może spowolnić odbudowę.

 12
Author: Daniel Earwicker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-24 06:50:20

Więc nie musisz ich kompilować za każdym razem, gdy budujesz swój projekt. Są one używane do nagłówków systemowych, które nie ulegną zmianie.

 7
Author: n8gray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-24 06:37:03

Przyspiesza kompilację.

Kiedy włączasz nagłówki z innych projektów, nie spodziewasz się ich zmienić. Jeśli umieścisz je w wstępnie skompilowanym nagłówku, kod ten nie będzie musiał być przekompilowany podczas wprowadzania zmian w kodzie źródłowym. Zmniejsza to powtarzalną kompilację niezmienionego kodu, przyspieszając czas kompilacji.

 7
Author: swongu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-24 06:41:11