每次 AI 编程工具出新版本,评论区就有人问:“C++ 是不是快被 AI 淘汰了?”
这问题每年出现一次,跟季节一样准时。逻辑链大概是这样:AI 写 Python 又快又准 → Python 是 AI 的主力语言 → C++ 语法复杂、特性臃肿 → LLM 生成的 C++ 代码质量堪忧 → C++ 没前途。
表面看有点道理。C++ 的语法确实复杂,模板元编程的坑 AI 不一定能避开,指针错误、生命周期问题,这些对 LLM 来说全是重灾区。
但另一面是:C++ 26 标准可能是十多年来对 AI 场景最友好的一次更新。
这篇文章不讲焦虑,只讲事实:C++26 带来了哪些直接服务于 AI/ML 开发的新技术,以及委员会的提案方向在怎么回应"AI 时代"这个命题。
三个头条:C++26 的主力特性
2025 年 6 月,WG21 在索菲亚会议上冻结了 C++26 的特性集。三个头条特性:静态反射(P2996)、契约编程(P2900)、异步执行模型(P2300,即 std::execution)。
静态反射:让 AI 理解你的类型
P2996 给 C++ 带来了 ^T(反照)和 [:x:](拼接)的编译期类型内省能力。
| |
这对 AI 代码生成意味着什么?LLM 生成的代码最大的问题之一是对类型结构"理解不足"。有了反射,AI 生成的序列化、反序列化、数据校验代码可以完全不依赖运行时 RTTI,编译期就完成所有类型操作。越少运行时魔法,生成的代码就越安全、越快。
Bloomberg 已经在 clang-p2996 分支上跑通了实验性实现。C++26 正式发布后,boost::describe、magic_enum 这些第三方反射库的工作量会大幅下降。
契约:给 AI 生成的代码上保险
P2900 Contracts 是 C++26 的另一个重磅。它给函数加上前置条件、后置条件和断言:
| |
默认编译模式下,契约只做编译期检查(不影响运行时)。但在调试模式下,它们变成运行时断言。生产构建中也可以选择编译期硬保证,违反契约直接拒绝编译。
对于 LLM 生成的代码,契约是一个天然的护栏。AI 可能写出 b == 0 还没检查的代码,但编译器不会放过 [[pre: b != 0]]。更关键的是,契约是自我文档化的——LLM 能在训练数据中看到这些标注,生成时会更倾向于遵守约定。
std::execution:GPU 和 CPU 的异步桥梁
P2300(std::execution,即 Sender/Receiver 模型)是 C++26 的第三个主力特性。它提供了一个去中心化的异步执行模型,可以统一描述 CPU 线程池、GPU kernel、网络 I/O 和文件 I/O 的异步工作流。
| |
Sender/Receiver 模型真正重要的不是它的 API,而是它允许库作者将 GPU、NPU、FPGA 统一到一个执行模型下。nvidia/stdexec、Intel/oneAPI 已经在推自己的实现。C++26 标准化后,AI 推理引擎(llama.cpp、TensorRT-LLM、vLLM 的 C++ 层)可以接入同一套异步框架。
ML 专项:从 mdspan 到 linalg
除了三个头条特性,C++26(以及它前身 C++23)在数值计算领域也有几个重要的补充。
std::mdspan(P0009):天然的多维数组视图
一个 4D 张量——在 Python 里就是 np.zeros((B, C, H, W))。在 C++26 里:
| |
mdspan 不拥有数据(视图语义),支持任意步长布局(row-major、col-major、strided),并且是零开销抽象的。C++26 还加入了 std::dims 简化维度声明。
std::linalg(P1673):标准化的 BLAS 接口
线性代数是 ML 的骨架。P1673 基于 mdspan,为 C++ 标准库定义了 BLAS 级别的矩阵运算:
| |
有了 std::linalg,在 C++ 里写推理引擎不再需要依赖外部 BLAS 库(OpenBLAS、MKL)。标准库接口的好处是,AI 编程工具(GitHub Copilot、Codex)不需要理解第三方库的专属 API,只需要生成标准 std::linalg:: 调用,编译器会自动路由到高性能后端。
std::simd(P1928):数据并行,人人可写
| |
std::simd 统一了 SSE、AVX、NEON、SVE 的向量化编程模型。AI 推理中的逐层归一化、激活函数(ReLU、Sigmoid)、以及小型向量运算,都可以直接用 std::simd 表达,不再需要手写 intrinsics。
Safety Profiles:向 Rust 学习,但不是 Rust
AI 生成 C++ 代码最大的风险是内存安全。C++26 没有像 D 语言或 Rust 那样引入 borrow checker,而是走了 Profiles(P3081)路线。
Profiles 是一组编译器规则,可以选择性启用:
| |
Herb Sutter 在 CppCon 2025 上说:“Profiles 不是要把 C++ 变成另一个语言,而是要给它加一层可选的、符合直觉的安全网。” 这层的存在对 AI 代码生成尤其重要,LLM 可以学习在 Profile 开关下生成更安全的代码。
组合起来看
C++26 的这些特性不是孤立的。把它们拼起来,能看到 C++ 标准委员会在悄悄做一件事:让 C++ 成为 AI 基础设施的语言。
| 需求 | C++26 方案 | 对应提案 |
|---|---|---|
| 异构计算 | Sender/Receiver 执行模型 | P2300 |
| 多维数组 | mdspan + dims | P0009 |
| 线性代数 | std::linalg(BLAS 接口) | P1673 |
| 数据并行 | std::simd | P1928 |
| 编译期类型推断 | 静态反射 | P2996 |
| 安全边界 | Contracts + Profiles | P2900, P3081 |
| 模式匹配 | Pattern Matching | P2392 |
每个特性单独看都是"语言改进"。合起来看,就是 C++ 在重新定位自己在 AI 时代的位置:不做 AI 训练的首选(Python 干得很好),但做 AI 部署和推理的基础设施语言。
llama.cpp 用纯 C++ 写了一个能在树莓派上跑 Llama 的推理引擎。TensorRT-LLM 用 C++ 写 GPU kernel 胶水层。PyTorch 的核心 libtorch 就是 C++。AI 的"最后一公里"——从量化推理到边缘部署——全是 C++ 的领地。 C++26 不是要来取代 Python,而是要让这段路更顺滑。
今日可执行动作
- 关注 clang-p2996 分支:Bloomberg 的实验性反射实现,已经能在 Godbolt 上测试 C++26 反射代码。去搜 “clang-p2996 Godbolt” 就能找到。
- 尝试 std::mdspan 写 ML 推理:你的 C++23/26 编译器(GCC 14+、Clang 18+)已经支持 mdspan。把手头的矩阵乘法从原始循环改成 mdspan + linalg,感受一下零开销抽象。
- 读 P2300 的设计意图:nVIDIA/stdexec 有一个可用的实现。如果你的项目涉及异步 GPU 计算,试一下 Sender/Receiver 模式怎么写。
参考
- P2996R13: Reflection for C++26 — isocpp.org/files/papers/P2996R13.html
- P2900R?: Contracts for C++26 (adopted in Kona 2025)
- P2300R10: std::execution — open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2300r10.html
- P0009R18: mdspan — open-std.org/jtc1/sc22/wg21/docs/papers/2024/p0009r18.html
- P1673R?: std::linalg — BLAS-based linear algebra
- P1928R?: std::simd — portable SIMD
- P3081R2: Core safety profiles for C++26 — open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3081r2.pdf
- InfoQ: C++26 Draft Finalized — infoq.com/news/2025/06/cpp-26-feature-complete/
- CppCon 2025: Reflection: C++’s Decade-Defining Rocket Engine — isocpp.org/blog/2026/05/cppcon-2025-reflection-cpps-decade-defining-rocket-engine-herb-sutter