文章核心观点 C++ 语言在追求极致性能的利基市场(如高频交易、游戏引擎、系统底层)中仍具有不可替代性,但其在内存安全、工具链生态和开发效率方面面临来自 Rust 等现代语言的严峻挑战,行业正在重新评估未定义行为与性能的权衡,并探索系统性解决安全问题的路径 [1][13][39] C++ 内存安全现状与挑战 - 新代码是漏洞主要来源:大多数内存安全漏洞源于新编写的代码,而非遗留系统,核心原因在于新代码尚未经过长期对抗性压力下的“代码硬化”过程 [4][5] - C++ 未能根除内存隐患:尽管引入了现代抽象,但 C++ 继承了 C 语言的不安全底层内存模型,开发者仍易写出如 std::vector 越界访问或使用未初始化变量等导致内存安全问题的代码 [7] - 安全工具普及率低且效果有限:如 Address Sanitizer 等动态分析工具因配置成本极高而未在 C++ 生态中普遍使用,且即便如 Google 在 Android 开发中强制启用所有 Sanitizer,其 C++ 代码产生的内存安全漏洞数量仍是 Rust 代码的约 1000 倍 [8][10][11] - 依赖管理加剧漏洞扩散:C++ 生态中依赖管理和版本升级成本高昂,导致用户常停留在有漏洞的旧版本上,使问题持续存在 [9] C++ 的核心价值与生存空间 - 以性能换安全的核心利基:C++ 最不可替代的优势在于允许开发者通过承担“未定义行为”风险来换取物理极限的性能,这在追求极致速度的领域(如高频交易、游戏开发)是关键价值主张 [13][15][16] - 庞大的历史惯性支撑:在科学计算等领域,C++ 的地位得益于海量经过数十年优化的成熟遗留代码库,重写这些代码的成本过高,构成了强大的护城河 [16] C++ 与 Rust 的生态及生产力对比 - 工具链生态的“降维打击”:Rust 的 Cargo 包管理器将添加依赖(如嵌入 JS 解释器)简化为“加一行配置”,而 C++ 因缺乏统一包管理器及编译器生态碎片化(GCC、Clang、MSVC 不兼容),导致依赖管理、构建和分发预编译库极为困难 [19][24][25] - 生产力对比取决于领域:在 Rust 擅长的编写高层安全业务代码领域,其生产力显著高于 C++;但若在 Rust 中强行追求 C++ 风格的极致底层微操,代码量可能膨胀四倍且生产力下降,两者结论不矛盾,关键取决于是否顺应语言设计哲学 [16][17][18] - 语言设计哲学的差异:Rust 将工具链(构建、依赖管理、文档生成)作为语言设计的一等公民,提供了统一体验;而 C++ 仅标准化语言本身,工具链处于放任状态,导致生态混乱 [26][27] - 泛型编程能力的取舍:Rust 缺乏 C++ 的模板特化和可变参数模板等功能,这是其为获得严格借用检查和受检泛型所带来的类型安全而做出的权衡,目前仍是未解难题 [28][29][30] AI 编程助手的影响与风险 - AI 生成代码被开源社区警惕:开源社区禁止 AI 生成贡献的现象有合理性,因为维护者需投入大量精力审查贡献,而贡献者可能投入零精力,需要建立信任机制 [33] - AI 工具使用体验参差:AI 可将开发者精力从“编写代码”转向“审查 AI 生成代码”,虽常节省时间,但生成的代码仍需人工仔细审查,人类必须保持在循环中 [33][34] - AI 生成代码的安全性因语言而异:学术研究表明,AI 生成的 C++ 代码客观上比人类编写的更差,内存安全漏洞更多,且开发者对其存在过度自信;而 Rust 的编译时安全检查能强制 AI 生成的代码符合安全规范,但两者均可能出现“幻觉”生成错误代码 [35] 未定义行为(UB)的未来与优化 - 标准委员会正在探索系统性解决方案:针对 UB,C++26 首次引入了“错误行为”概念,将部分 UB 转为有定义,但目前许多提案缺乏实质内容,最扎实的努力在于系统性地编目和分类所有已知 UB 实例,为系统性消除奠定基础 [38][39] - 硬件演进改变安全与性能权衡:现代超标量 CPU 架构的并行能力使得许多安全检查的代价大幅降低,甚至可“免费”获得,这促使行业观念从“UB 利于优化”转向“尽可能消除 UB” [40] - 编译器优化可兼顾安全与性能:通过编写引导优化器的代码(如在循环前加入前置断言),编译器可自动消除冗余的重复安全检查,从而在不牺牲安全性的前提下获得高性能,此模式在 Rust 中已应用,在 C++ 中同样适用 [41][42]
“AI 写的 C++ 代码,客观上比人类更烂”,吴咏炜对话 Adobe 首席科学家 David Sankel
36氪·2026-02-12 19:19