前置知识: 计算机基础

C++ 是什么:为每一毫秒较真的人,最终都会遇见它

11 min入门

以「一万人在线的排行榜为什么撑不住」引入,讲清 C++ 的定位、零开销抽象、与 C 的真实关系、编译到机器码的心智模型、主战场与版本策略,附现代 C++ 代码试读与常见误区实录。

前置知识

  • 已完成 编程基础:知道变量、函数、循环大概是什么,用哪门语言学都行;
  • 想知道 C++ 在职业路线里的位置,可翻 系统方向路线,不读也不影响本文。

还没学过也没关系:本文不需要你写过 C++,也不要求装好编译器;首次出现的词,当场一句话解释或标注哪篇讲透。

学习目标

读完本文你将能够:

  1. 用一句话解释 C++ 的「零开销抽象」,并说出它省掉了什么税;
  2. 说清 C++ 与 C 的真实关系(兼容但不等同),不再把「C++ 就是 C 加个类」当常识;
  3. 用「编译到本地机器码」的心智模型解释 C++ 为什么快,以及它与 Java、JavaScript 的根本差别;
  4. 看懂一段现代 C++ 代码的结构(哪怕暂时不会写);
  5. 说出教学基准版本是 C++23,以及 C++26 目前处在什么状态。

预计 30 到 45 分钟,含 1 个试读示例与 3 道练习。

1. 问题引入:一万人在线的排行榜

假设你在做一个实时对战游戏:服务器每秒给每个房间重算一次排行榜,桌面端还要以每秒 60 帧的节奏刷新画面。你用 Python 一天写完原型,本地测试丝滑;压测到一万人在线时,一轮重算要 40 毫秒,帧率掉到个位数,玩家开始刷「幻灯片」。

你把热点函数改写成 C++,同一台机器降到 0.3 毫秒,帧率回满。这不是玄学:两类语言对「每一毫秒」的定价不同——Python 的每一行背后都站着解释器、对象系统和垃圾回收的固定开销,C++ 的每一行被直接翻译成机器指令,没有中间商。

**要一寸一寸拧出性能的人,最后都会来到 C++。**这句话是本文的主线,下面把「C++ 到底是什么」拆成五个可带走的认知。

2. 核心概念:零开销抽象

C++ 的定位浓缩成一句行业口号(出自 C++ 之父 Bjarne Stroustrup):你不为你没用的东西付费;你用到的东西,也没法靠手写做得更好。

展开成大白话:C++ 给你高级工具(自动扩容的数组、自动管内存的智能指针、模板),但它们编译成机器码后不比你手写的底层版本慢。用高级功能不交税,不用也不背任何运行时的包——没有虚拟机,没有垃圾回收器替你看家。对照另外两门你可能学过的语言:

  • Java:每个对象自带管理开销,垃圾回收器定期出来扫街——便利的代价是「你说了不算」的停顿与内存占用;
  • Python:万物皆对象,每一行都经过解释器——开发效率的代价是几十倍的性能差距;
  • C++:类型与内存布局在编译期定死,运行时只剩你写下的那点逻辑。

第 3 节代码里的 std::vector<int>(可自动扩容的数组)编译后,跟老手手写的「malloc 一块内存 + 手动管边界」几乎一样快——高级与底层不是二选一,而是同一份机器码的两层写法。

主战场也因此清晰:

主战场代表为什么必须是 C++
游戏引擎Unreal Engine 及多数商业引擎每帧 16 毫秒的硬预算
浏览器Chrome 的渲染层与 V8 引擎每一帧都在跟 16 毫秒较真
数据库MySQL、MongoDB、RocksDB每秒百万次读写,内存要精打细算
高频交易交易所撮合系统、量化柜台延迟按微秒计价,快就是钱
嵌入式的引擎层车机系统、机器人、工业控制内存以 KB 计,没有垃圾回收器的容身之地

3. 示例:先看一段现代 C++ 长什么样

不用懂每一行,先看气质:

cpp
#include <iostream>
#include <string>
#include <vector>

int main() {
    std::vector<int> scores = {90, 85, 77, 92, 68};
    int total = 0;
    for (int score : scores) {
        total += score;
    }
    std::string winner = "长跑小狐";
    std::cout << "冠军: " << winner << '\n';
    std::cout << "平均分: " << total / scores.size() << '\n';
    return 0;
}

预期输出:

text
冠军: 长跑小狐
平均分: 82

逐个混个眼熟(后面篇章正式讲透):#include 把标准库工具引进来;std::vector<int> 是能自动扩容的整数数组,<int> 表示「里面装的是 int」;for (int score : scores) 是范围 for 循环,逐个取出元素;std::cout << ... 把内容送到标准输出,<< 可以连着写。

看出一件事就够了:现代 C++ 的常规代码并不比 Python 可怕,它只是把「类型」「编译」「资源自己管」明明白白写在代码里。想现在就跑?两步编译在 基本语法与第一个程序 拆解。

4. 与 C 的关系:兼容,但不等同

C++ 从 C 扩展而来,名字里的 ++ 就是「C 的增强版」。真实关系三条,够用一辈子:

  1. 大多数合法 C 代码也是合法 C++。本仓库 C 语言模块 里学的指针、数组、结构体在 C++ 里全部可用,两门语言共用一套 GCC 工具链;
  2. 但 C++ 不是 C 的严格超集。少数写法在 C 里合法、在 C++ 里报错,「C++ 是 C 的超集」是流传很广的以讹传讹;
  3. 精神上分道扬镳。C 的答案是「一切自己管」;C++ 的答案是「能用工具管就让工具管」——资源交给 RAII 与智能指针(本模块 130 到 160 篇的主角)。

分工现状:内核与单片机多用 C;游戏引擎、浏览器、数据库、量化系统多用 C++。两者经常同框——C++ 可直接调用 C 库,大量「C++ 项目」里住着 C 代码。

5. 心智模型:编译到本地机器码,没有虚拟机

一句话:C++ 源码被编译器直接翻译成你当前 CPU 的机器指令,程序运行时脚下没有任何中间层。

text
C++ 源码 ──→ 编译器(g++) ──→ 本地机器码 ──→ CPU 直接执行
Java 源码 ──→ javac ──→ 字节码 ──→ JVM 解释/即时编译
JS 源码 ──→ 浏览器/Node 引擎边解析边执行

对照记忆:Java 活在 JVM 里,一次编译到处运行,代价是 JVM 的内存与管理开销;JS 没有编译期类型检查,错误跑到那行才炸。C++ 在编译期把类型、内存布局、函数调用全部定死——运行时快,代价是换平台要重新编译。

6. 版本策略:学哪个 C++

  • C++23 已定稿,正式编号 ISO/IEC 14882:2024,是当前最新的完整标准;
  • C++26 正在进行:特性已冻结,标准文本还在流程里,内容以草案为准,编译器只是部分支持;
  • 标准每三年一版,别背年表,最新状态以 isocpp.org 为准。

本模块以 C++23 为教学基准,编译时用 -std=c++23 开关告诉编译器「按 2023 版规则来」(020 篇展开)。个别新特性各编译器支持有早晚,遇到「特性不存在」先查 cppreference 的编译器支持表(见官方文档一节)。

7. 修改实验

以下实验都在第 3 节的代码上做(跑通环境后回来做,预计 10 分钟):

实验一:把 scores 换成你自己的五个分数,先在纸上算出平均分再运行,核对输出。

实验二:把 winner 换成你的名字或角色名,输出应变成两行你自己的战报。

实验三(纸上推演):把最后一个 68 改成 96,预测输出——注意 C++ 的整数除法会截断小数(90 + 85 + 77 + 92 + 96 = 440,440 / 5 = 88,恰好整除是运气;试试 441 会输出什么)。整数除法的完整规则是 类型系统 的正式内容,这里先埋个钩子。

8. 常见错误与调试实录

错误一:没装编译器就照抄命令。终端里执行 g++ --version:

text
'g++' 不是内部或外部命令,也不是可运行的程序或批处理文件。

(macOS/Linux 上是 zsh: command not found: g++ 这类。)读报错:系统不认识 g++——工具链没装或不在 PATH,修复见 020 篇工具链一节。

错误二:文件其实叫 hello.cpp.txt。Windows 记事本默认隐藏扩展名,你以为存了 hello.cpp,编译时:

text
g++: error: hello.cpp: No such file or directory

读报错三步:编译器说找不到文件 → ls(或 dir)看真实文件名 → 尾巴上多个 .txt,打开「显示扩展名」重命名。这条报错九成是文件名对不上,不是代码写错。

错误三(概念坑):以为 C++ 会像 Python 一样在出错处停下并指认。C++ 的错误分两层:编译期错误(语法、类型不对,编译器拦下并给出行号)与未定义行为(代码合法、结果不可预测,编译器一个字不说)。后者是 C++ 与托管语言的真正分界,030 篇现场演示。

9. 实际项目中的使用场景

  • 性能热点的最后一站:PyTorch、NumPy 这类 Python 库的核心计算都在 C/C++ 里——提速的常规操作就是把热点换 C++ 重写;
  • 读招聘 JD:游戏引擎、量化交易、基础架构、浏览器内核岗位,C++ 几乎都是硬技能;
  • 何时不用:写脚本、做网页、跑数据分析原型,Python/JavaScript 更快;C++ 的价值集中在「性能预算被卡死」的环节,为不需要性能的代码选 C++ 是给自己上刑。

10. 小练习

预测题(5 分钟):看第 3 节代码,若把最后一个 68 改成 96,预期输出是什么?先写答案。(验证:用 030 篇的两步命令跑通后核对,输出 冠军: 长跑小狐 与 平均分: 88。)

修改题(15 分钟):把第 3 节程序改成输出总分、平均分、冠军三行,冠军在最后。验收:与你的预期逐字一致。

修 Bug 题(15 分钟):小李在 Windows 上把代码存成 board.cpp.txt(记事本隐藏了扩展名),执行 g++ board.cpp -o board 报错如下。按读报错三步定位并修复:

text
g++: error: board.cpp: No such file or directory

挑战题(半小时,纸上推演):给定数组 {100, 60, 80},手动模拟第 3 节的范围 for 循环,一步步写出 total 的每一步变化;再回答:若需求改为「只累加不低于 60 的分数」,循环体需要加什么?提示:一个判断语句;展开:判断的骨架是 if (条件) { ... },控制流的规则在本模块中段展开,先照抄即可。

11. 与之前和之后的知识的关系

  • 往前:编程基础 给了你变量、函数、循环的通用概念,本文把它们落到一门具体语言上;
  • 往后:C++ 概述与现代标准 把「现代」二字与工具链展开;基本语法与第一个程序 让你亲手跑通程序并见到未定义行为;类型系统 讲透整数除法截断这类规则;
  • 更远:050 篇解开 std:: 前缀之谜,080 与 120 篇的引用与指针是「自己管资源」的深水区。

12. 官方文档

13. 自我检查

  • 能一句话解释零开销抽象,并举出一个它省掉的税(无虚拟机、无垃圾回收、无解释器开销任一);
  • 能说出 C++ 与 C 的一条相同、一条不同;
  • 能画出「源码 → 编译器 → 机器码」的流程,并说出 Java 多了哪一层、代价是什么;
  • 知道教学基准是 C++23、C++26 仍在进行中,最新状态去哪里查。

本章总结

C++ 的定位是零开销抽象:给你高级工具,却不为没用到的部分收费——所以游戏引擎、浏览器、数据库、高频交易都是它的主战场。它与 C 兼容但不等同,精神差异在于「让工具管资源」;它直接编译成本地机器码,没有虚拟机这层中间商,代价是平台绑定与「编译器不替你兜底」。教学基准 C++23,C++26 进行中,最新状态以 isocpp.org 为准。

下一步

进入 C++ 概述与现代标准:C++11、C++20、C++23 三次大版本各带来了什么、编译器三件套怎么选、本模块主线怎么走——把「现代 C++」的「现代」落到实处。