C++ 系统梳理

C++ 是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计、1985 年首次发布的通用编程语言。 它在 C 语言基础上引入了类、继承、多态等面向对象特性,并持续吸纳泛型编程、函数式编程等范式, 是目前高性能系统软件、游戏引擎、嵌入式、量化交易等领域的主力语言。

设计哲学:零开销抽象(Zero-Overhead Abstraction)、不为你不需要的东西付出代价、 接近硬件的控制力、多范式融合。

2. 标准演进史

标准年份关键特性
C++98 1998 第一个 ISO 标准。类、虚拟继承、模板、STL、异常处理、RTTI
C++03 2003 C++98 的补丁版本,修复缺陷
C++11 2011 革命性版本。auto、lambda、move semantic、smart pointer、variadic template、constexpr、thread、unordered_map
C++14 2014 泛型 lambda、auto 返回类型推导、二元字面量、make_unique、变量模板
C++17 2017 if constexpr、structured binding、filesystem、optional/variant/any、fold expression、CTAD
C++20 2020 concept、ranges、coroutine、module、spaceship operator、consteval、format
C++23 2023 std::expected、std::flat_map/set、deducing this、which/lift、monadic optional、print
C++26 预计 2026 reflection、contract、pattern matching、hive scheduling(进行中)
关键分水岭:C++11 被视为"现代 C++"的起点,从此 C++ 从 "C with Classes" 真正成为一门独立的现代化语言。 C++20 则是第二次飞跃,引入 concept / ranges / coroutine / module 四大核心特性,彻底改变了 C++ 的编程范式。

3. 行为图(系统"做什么")

3.1 用例图 — C++ 开发者视角

从 C++ 开发者的角色出发,梳理使用 C++ 系统的典型用例全景。

C++ 用例图
C++ 开发者用例图

3.2 活动图 — C++ 编译链接全流程

从源码到可执行文件,C++ 编译系统经历预处理、编译、汇编、链接四个阶段。

C++ 编译活动图
C++ 编译链接全流程活动图(带泳道)

Demo: 编译过程分步演示

// main.cpp
#include <iostream>
#define PI 3.14159
int main() {
    std::cout << PI << std::endl;
    return 0;
}
# 1. 仅预处理(展开宏和头文件)
g++ -E main.cpp -o main.i

# 2. 仅编译(生成汇编)
g++ -S main.cpp -o main.s

# 3. 仅汇编(生成目标文件)
g++ -c main.cpp -o main.o

# 4. 链接(生成可执行文件)
g++ main.o -o main

# 一键完成以上四步
g++ main.cpp -o main

3.3 状态机图 — C++ 对象生命周期

C++ 对象的生命周期严格受 RAII(资源获取即初始化)原则约束,从内存分配到析构回收,每个状态转换都有明确语义。

C++ 对象生命周期状态机
C++ 对象生命周期状态机图

Demo: 对象生命周期代码演示

#include <iostream>
#include <memory>

class Widget {
    int id;
public:
    Widget(int i) : id(i) { std::cout << "构造 " << id << "\n"; }
    ~Widget()             { std::cout << "析构 " << id << "\n"; }
    void work()           { std::cout << "工作 " << id << "\n"; }
};

int main() {
    Widget a{1};                 // 栈对象:自动构造
    auto b = new Widget{2};      // 堆对象:手动 new
    auto c = std::make_unique<Widget>(3); // 智能指针管理

    a.work();
    b->work();
    delete b;                    // 手动 delete
    // c 超出作用域自动析构
    // a 超出作用域自动析构
}
/* 输出:
构造 1
构造 2
构造 3
工作 1
工作 2
析构 2    (手动 delete)
析构 3    (unique_ptr 自动释放)
析构 1    (栈对象自动析构)
*/

3.4 序列图 — 模板实例化过程

模板是 C++ 的编译期多态机制,实例化过程在编译时完成,不产生运行时开销。

C++ 模板实例化序列图
C++ 模板实例化编译期序列图

Demo: 模板代码示意

// 函数模板
template<typename T>
T max(T a, T b) {
    return a > b ? a : b;
}

int main() {
    auto i = max(3, 5);               // 实例化 max<int>
    auto d = max(3.14, 2.71);         // 实例化 max<double>
    auto s = max(std::string("a"),    // 实例化 max<std::string>
                 std::string("b"));
}

4. 结构图(系统"由什么组成")

4.1 包图 — C++ 标准库全景

ISO C++ 标准库包含约 150+ 个头文件,按功能划分为容器、算法、IO、多线程等模块。

C++ 标准库包图
C++ 标准库模块包图

4.2 组件图 — C++ 编译工具链

C++ 生态系统由编译器、链接器、构建系统、包管理器、调试器、分析工具等多组件协同工作。

C++ 工具链组件图
C++ 编译工具链生态组件图

4.3 类图 — C++ 类型体系

C++ 的类型系统可以分为基础类型、复合类型、类类型三大分支,体现了从底层到高层的抽象层次。

C++ 类型体系类图
C++ 类型体系层次类图

Demo: 类型体系代码映射

// ---- 基础类型 ----
int    i   = 42;           // 算术类型(整型)
double pi  = 3.14159;      // 算术类型(浮点)
bool   ok  = true;         // 布尔类型
char   ch  = 'A';          // 字符类型
void*  ptr = nullptr;      // 空类型(指针值)

// ---- 复合类型 ----
int    arr[5] = {1,2,3,4,5};          // 数组
int&   ref    = i;                      // 引用
int*   raw    = &i;                     // 指针
int    (*fn)(int, int) = [](int a,int b){return a+b;}; // 函数指针

// ---- 类类型 ----
#include <string>
#include <vector>
#include <memory>
#include <functional>

std::string s   = "hello";                  // 字符串
std::vector<int> v = {1,2,3};              // 容器
std::shared_ptr<int> sp = std::make_shared<int>(100); // 智能指针
std::function<int(int,int)> f = [](int a,int b){return a*b;}; // 函数对象

// ---- 用户自定义类型 ----
class MyClass {
    int data;
public:
    MyClass(int d) : data(d) {}
    int get() const { return data; }
};

enum class Color { Red, Green, Blue };     // 枚举类

// ---- C++20 concept ----(类型约束)
template<typename T>
concept Addable = requires(T a, T b) { a + b; };

4.4 部署图 — C++ 应用典型部署架构

C++ 应用因其性能特性,广泛部署于嵌入式设备、桌面客户端、游戏主机、高性能服务器等场景。

C++ 应用部署图
C++ 应用多场景部署架构图

5. 用户使用手册

5.1 编译与构建

工具用途典型命令
GCC (g++) GNU C++ 编译器 g++ -std=c++20 -O2 main.cpp -o main
Clang (clang++) LLVM C++ 前端 clang++ -std=c++20 -O2 main.cpp -o main
MSVC (cl.exe) 微软 C++ 编译器 cl /std:c++20 /O2 main.cpp
CMake 跨平台构建系统生成器 cmake -B build && cmake --build build
Ninja 快速增量构建工具 cmake -G Ninja -B build && ninja -C build
Make 经典构建自动化 make -j$(nproc)
Bazel Google 构建系统 bazel build //path:target

CMake 最小项目结构

# CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(MyApp VERSION 1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(myapp
    src/main.cpp
    src/utils.cpp
)

target_include_directories(myapp PRIVATE include)
target_link_libraries(myapp PRIVATE fmt::fmt)

5.2 包管理与依赖

工具类型特点
vcpkg 微软维护 CMake 原生集成,2000+ 包,支持 triple 交叉编译
Conan 社区维护 去中心化,支持多平台,Python 编写 recipe
CPM.cmake CMake 脚本 轻量,单脚本下载依赖源码,适合小型项目
FetchContent CMake 内置 CMake 3.11+ 内置,直接在 configure 阶段拉取源码
spack HPC 场景 超算/科学计算场景的包管理器

vcpkg 使用示例

# 安装 vcpkg
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg && ./bootstrap-vcpkg.sh

# 安装包
./vcpkg install fmt spdlog nlohmann-json

# 在 CMake 中使用
cmake -B build -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake
cmake --build build

5.3 调试与分析工具

工具用途
GDBGNU 调试器
LLDBLLVM 调试器
WinDbgWindows 调试器
Valgrind内存泄漏/错误检测
AddressSanitizerGCC/Clang 内存错误检测
ThreadSanitizer数据竞争检测
perfLinux 性能分析
gperftoolsGoogle 性能分析
InstrumentsmacOS 性能分析
clang-tidy静态代码检查
clang-format代码格式化
include-what-you-use头文件依赖分析
编译选项效果
-g生成调试符号
-O0关闭优化(方便调试)
-O2/-O3标准/激进优化
-fsanitize=address启用 AddressSanitizer
-fsanitize=thread启用 ThreadSanitizer
-fsanitize=undefined启用 UBSan(未定义行为)
-Wall -Wextra -Wpedantic开启大部分警告
-Werror警告视为错误
-fno-omit-frame-pointer保留帧指针(方便 perf)
-DNDEBUG关闭 assert
-flto链接时优化

5.4 常用命令速查

编译与构建

# 单文件编译
g++ -std=c++20 -O2 main.cpp -o main

# 多文件编译
g++ -std=c++20 -c a.cpp -o a.o
g++ -std=c++20 -c b.cpp -o b.o
g++ a.o b.o -o main

# 创建静态库
ar rcs libmylib.a a.o b.o

# 创建动态库 (Linux)
g++ -shared -fPIC a.cpp b.cpp -o libmylib.so

# 链接库
g++ main.cpp -L./lib -lmylib -o main

# CMake 跨平台
cmake -B build -G Ninja
cmake --build build

调试与分析

# GDB 调试
gdb ./main
(gdb) break main.cpp:10
(gdb) run
(gdb) print variable
(gdb) backtrace

# 内存检查
valgrind --leak-check=full ./main

# sanitizer 检查
g++ -fsanitize=address -g main.cpp -o main
./main

# 性能分析
perf record ./main
perf report

# 静态分析
clang-tidy main.cpp -- -std=c++20

# 格式化代码
clang-format -i *.cpp *.h