54 Stimmen

Warum vorkompilierte Header verwenden (C/C++)?

Warum vorkompilierte Header verwenden?


Wenn ich die Antworten lese, habe ich den Verdacht, dass das, was ich mit ihnen gemacht habe, ziemlich dumm ist:

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

3 Stimmen

Ein wichtiger Hinweis zu Visual Studio: Stellen Sie sicher, dass das erste #include in jedem Header #include "stdafx.h" ist, sonst werden Ihre Dateien nicht geparst! Dumm, ich weiß. Aber es ist ein leicht zu begehender Fehler.

2 Stimmen

Genauer gesagt wird alles, was über #include "stdafx.h" hinausgeht, nicht geparst. Siehe de.wikipedia.org/wiki/Vorkompilierte_Kopfzeile

76voto

Todd Gardner Punkte 13073

In C/C++ ist der #include-Mechanismus eine textuelle Kopie der angegebenen Datei in die aktuelle Datei. Header schließen andere Header ein (die wiederum andere Header einschließen), wenn Sie also eine #include Das kann dazu führen, dass in jede cpp-Datei (oder cxx, c, was auch immer) Zehntausende von C++-Zeilen eingefügt werden, die jedes Mal neu kompiliert werden müssen. Dies kann bei großen Projekten einen erheblichen Engpass darstellen.

Vorkompilierte Header beschleunigen dies, indem sie jeden Header einmal kompilieren und dann den kompilierten Zustand in die cpp einfügen, in der sie enthalten sind.

1 Stimmen

Ich war auf der Suche nach einem Einblick, was eigentlich ein vorkompilierter Header ist, denn wie wir wissen, sind Header-Dateien keine Übersetzungseinheit an sich. Gute Erklärung, danke.

0 Stimmen

Schöne kurze Erklärung. Dies sollte als Antwort markiert werden.

1 Stimmen

Was bedeutet "jeden Header einmal kompilieren"? Werden die Header kompiliert? Es sind doch nur Deklarationen ... oder?

45voto

rlbond Punkte 62333

Es kompiliert eine Los schneller. Die Kompilierung von C++ dauert ohne sie Jahre. Versuchen Sie einmal, die Zeit in einem großen Projekt zu vergleichen!

2 Stimmen

Wenn ein Projekt klein ist - weniger als 10 Dateien - sollte man dann trotzdem vorkompilierte Header verwenden?

1 Stimmen

Wie groß sind die Dateien?

1 Stimmen

@Danijel Sie sollten es selbst überprüfen. Wenn Sie zu vorkompilierten Headern wechseln und ein paar Mal neu kompilieren und keinen erkennbaren Unterschied feststellen, ist es sinnlos. Wenn Sie feststellen können, dass es schneller kompiliert, ohne auf die Uhr zu schauen, dann ja, dann sollten Sie sie verwenden.

12voto

Daniel Earwicker Punkte 111630

Re: Ihre aktuelle Nutzung, wenn Sie ein Ziel mit einer sehr großen Anzahl von Dateien haben, kann es immer noch schneller sein, PCH auf diese Weise zu verwenden - versuchen Sie, sie auszuschalten, um das herauszufinden. Es kommt darauf an: Wenn Sie viele eigene Header haben, die Sie nur selten ändern, und eine sehr große Anzahl von Quelldateien haben, die Sie viel häufiger ändern, dann wird Ihre PCH-Nutzung die Wiederherstellungszeiten verkürzen.

Normalerweise wird jedoch empfohlen, nur Dinge in die PCH aufzunehmen, die sich nie ändern, da die Erstellung der PCH selbst mit einem gewissen Aufwand verbunden ist. Wenn Sie diesen bei jedem Rebuild auslösen (indem Sie ständig einen Ihrer Header verändern), kann die Verwendung von PCH den Rebuild langsamer machen.

0 Stimmen

Diese Dateien ändern sich so ziemlich bei jedem Build :P

7voto

n8gray Punkte 4939

So müssen Sie sie nicht jedes Mal kompilieren, wenn Sie Ihr Projekt erstellen. Sie werden für System-Header verwendet, die sich nicht ändern werden.

7voto

swongu Punkte 2179

Es beschleunigt die Kompilierung.

Wenn Sie Kopfzeilen aus anderen Projekten übernehmen, erwarten Sie nicht, dass Sie diese ändern. Wenn Sie diese in einen vorkompilierten Header einfügen, muss dieser Code nicht neu kompiliert werden, wenn Sie Änderungen an Ihrem Quellcode vornehmen. Dadurch wird das wiederholte Kompilieren von unverändertem Code reduziert und die Kompilierzeit verkürzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X