Подтвердить что ты не робот

Зачем использовать предварительно скомпилированные заголовки (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"
4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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