【笔记】Cherno C++ Tutorial note 04

Unions

Virtual Destructors

Casting

Conditional and Action Breakpoints

Safety in modern C++ and how to teach it

Precompiled Headers in C++

在大型项目中预编译头(PCH)可能更常用。

获取头文件并转换到一种编译后的格式,这一编译器就可以直接使用,而不需要每次编译都读取

如STL,每次#include<vector>都需要读取整个头文件,vector的头文件也需要读取。

这样编译时间就会很长。并且每次都要重复编译。

因此预编译头就把一大堆头文件编译一次,处理成二进制格式,这样编译器就可以很快处理。

Not to do

预编译头重新构建也需要花时间,因此不要把经常改动的文件放进去,

因此预编译头常用于外部库。如STL,glfw

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "pch.h"

int main(){
LOG("Hello World")
}

//pch.h
#pragma once
#include <iostream>
#include <algorithm>
#include <funcitonal>
#include <memory>
#include <thread>
#include <utility>

//Data Stuctures
#include <string>
#include <stack>
#include <deque>
#include <array>
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>

//Windows API
#include <Windows.h>

那么如果不用预编译头的话,每次编译的中间文件都会把这一大堆头文件里的代码复制进去。(实测有接近4w行,就为了一个hello world)

所以只需要在做一个cpp文件

1
2
//pch.cpp
#include "pch.h"

在这个文件的C++属性中开启创建预编译头属性

image-20230409164925404

并在项目设置中同样位置设置成使用预编译头,并选择对应的头文件。

image-20230409165118838

那么就会在对应位置生成一个预编译头的输出文件

Cherno也演示了用g++如何使用预编译头。直接编译pch.h,会出现一个gch文件,这也就是预编译头的输出文件了。