Зачем использовать предварительно скомпилированные заголовки (C / C ++)? - PullRequest
40 голосов
/ 24 мая 2009

Быстрый вопрос - зачем использовать предварительно скомпилированные заголовки?

EDIT: Читая ответы, я подозреваю, что то, что я делал с ними, довольно глупо:

 #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"

Ответы [ 5 ]

49 голосов
/ 24 мая 2009

В C / C ++ механизм #include представляет собой текстовую копию файла, указанного в текущем файле. Заголовки включают другие заголовки (которые включают в себя еще другие заголовки), поэтому, когда вы делаете #include, это может быть добавление десятков тысяч строк C ++ в каждый файл cpp (или cxx, c, что угодно), все из которых должны быть компилируется каждый раз. Это может стать серьезным узким местом для крупных проектов.

Предварительно скомпилированные заголовки ускоряют это, компилируя каждый заголовок один раз, затем включая это скомпилированное состояние в cpp, в который они включены.

39 голосов
/ 24 мая 2009

Это компилирует много быстрее. Компиляция C ++ занимает годы без них. Попробуйте сравнить когда-нибудь в большом проекте!

10 голосов
/ 24 мая 2009

Re: ваше текущее использование, если у вас есть цель с очень большим количеством файлов, возможно, будет еще быстрее использовать PCH таким образом - попробуйте отключить их, чтобы выяснить это. Это зависит от того, что: если у вас много собственных заголовков, и вы меняете их нечасто, а у вас очень большое количество исходных файлов, которые вы меняете гораздо чаще, то использование PCH сократит время восстановления.

Но обычный совет - помещать в PCH только те вещи, которые никогда не меняются, потому что есть определенные накладные расходы на производство самого PCH. Если вы активируете это при каждой перестройке (постоянно изменяя один из ваших заголовков), использование PCH может замедлить перестройку.

7 голосов
/ 24 мая 2009

Ускоряет компиляцию.

Когда вы включаете заголовки из других проектов, вы не ожидаете их изменения. Если вы поместите их в предварительно скомпилированный заголовок, то этот код не нужно будет перекомпилировать при внесении изменений в исходный код. Это уменьшает повторяющуюся компиляцию неизмененного кода и ускоряет время компиляции.

7 голосов
/ 24 мая 2009

Так что вам не нужно компилировать их каждый раз, когда вы создаете свой проект. Они используются для системных заголовков, которые не изменятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...