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

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

РЕДАКТИРОВАТЬ: Читая ответы, я подозреваю, что то, что я делал с ними, довольно глупо:

 #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 ответов

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам