stdafx c++ precompiled-headers

stdafx - pch.h c++



¿Por qué usar encabezados precompilados(C/C++)? (5)

Acelera la compilación.

Cuando incluye encabezados de otros proyectos, no espera cambiarlos. Si los coloca en un encabezado precompilado, no será necesario volver a compilar ese código cuando realice cambios en el código fuente. Esto reduce la compilación repetitiva de código sin modificar, acelerando el tiempo de compilación.

Pregunta rápida: ¿Por qué usar encabezados precompilados?

EDIT: leyendo las respuestas, sospecho que lo que he estado haciendo con ellos es algo estúpido:

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


En C / C ++, el mecanismo #include es una copia textual del archivo especificado en el archivo actual. Los encabezados incluyen otros encabezados (que incluyen otros encabezados), de modo que cuando hace un #include, podría estar agregando decenas de miles de líneas de C ++ en cada archivo cpp (o cxx, c, lo que sea), todo lo cual debe ser compilado cada vez. Esto puede ser un cuello de botella severo para proyectos grandes.

Los encabezados precompilados aceleran esto compilando cada encabezado una vez, luego incluyen ese estado compilado en el cpp en el que están incluidos.


Por lo tanto, no tiene que compilarlos cada vez que crea su proyecto. Se usan para encabezados de sistema que no van a cambiar.


Re: su uso actual, si tiene un objetivo con una gran cantidad de archivos, puede ser más rápido usar PCH de esa manera; intente apagarlos para averiguarlo. Depende: si tiene muchos de sus propios encabezados, y los cambia con poca frecuencia, y tiene una gran cantidad de archivos fuente que cambia con mucha frecuencia, entonces el uso de PCH reducirá los tiempos de reconstrucción.

Pero el consejo normal es solo poner cosas en PCH que nunca cambien, porque hay cierta sobrecarga para producir PCH. Si desencadenas eso con cada reconstrucción (ajustando constantemente uno de tus encabezados), el uso de PCH puede hacer que la reconstrucción sea más lenta.


Se compila MUCHO más rápido. La compilación C ++ lleva años sin ellos. ¡Intenta comparar alguna vez en un gran proyecto!