Domanda

Perché utilizzare intestazioni precompilate?


Leggendo le risposte, ho il sospetto che cosa ho fatto con loro è una specie di stupido:

#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"
È stato utile?

Soluzione

Si compila un molto più veloce. compilazione C ++ richiede anni senza di loro. Provate a confrontare po 'di tempo in un grande progetto!

Altri suggerimenti

In C / C ++, il meccanismo di #include è una copia testuale del file specificato nel file corrente. Intestazioni includono altre intestazioni (che comprendono ancora altri header), in modo che quando si fa un # include, potrebbe essere l'aggiunta di decine di migliaia di linee di C ++ in ogni file cpp (o cxx, c, a prescindere), ognuno dei quali ha bisogno di essere compilato ogni volta. Questo può essere un collo di bottiglia sever per i grandi progetti.

intestazioni precompilate accelerare l'operazione mediante la compilazione di ogni intestazione una volta, quindi compreso quello stato compilato nel cpp che sono inclusi in.

Re: l'uso corrente, se si dispone di un bersaglio con un gran numero di file, potrebbe essere ancora più veloce da utilizzare PCH in quel modo - prova a spegnere per scoprirlo. Dipende: se si hanno un sacco di intestazioni del proprio, e si cambia loro solo di rado, e si dispone di un numero molto elevato di file di origine che si cambia molto più frequentemente, quindi l'utilizzo PCH ridurrà i tempi di ricostruzione

Ma consiglio normale è di mettere solo le cose in PCH che non cambiano mai, perché non v'è una certa testa a produrre il PCH stesso. Se si attiva che fuori con ogni ricostruzione (modificando costantemente uno dei vostri header), utilizzando PCH può rendere la ricostruzione più lenta.

Quindi, non c'è bisogno di compilare ogni volta che si genera il progetto. Sono utilizzati per le intestazioni di sistema che non stanno andando a cambiare.

Si accelera la compilazione.

Quando sei tra cui intestazioni da altri progetti, non vi aspettate di cambiarli. Se mettete questi in un'intestazione precompilata, allora che il codice non dovrà essere ricompilato quando si apportano modifiche al codice sorgente. Questo riduce la compilazione di codice ripetitivo invariato, accelerando il tempo di compilazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top