C++ 阅读时间 2 分钟

为什么内存安全如此难以加入 C++ 语言?

分享本文
Why is memory safety so hard to add to the C++ language?

为 C++ 增加内存安全性之所以困难,源于该语言的根本设计原则及其深厚的历史积淀。以下是内存安全性难以融入 C++ 的关键原因:

性能与安全的权衡

  • C++ 旨在提供极致性能和对系统资源(包括内存)的细粒度控制。引入安全特性往往需要运行时检查,这会带来性能开销。这与 C++ 的“零成本抽象”理念相冲突——特性只有在被显式使用时才应产生开销。

向后兼容性

  • 数十年来积累了海量的 C++ 代码库。确保新的安全特性不破坏现有代码是一项重大挑战。语言设计者需要保证添加内存安全性不会扰乱严重依赖 C++ 当前行为的遗留系统。

手动内存管理

  • C++ 的标志性特性之一是使用指针进行手动内存管理,new / delete以及自定义分配器。引入垃圾回收或自动化内存管理等内存安全特性,将要求 C++ 程序的编写方式发生重大改变,并可能扰乱现有实践。

语言的复杂性

  • C++ 是一门复杂的语言,众多特性以错综复杂的方式交互。要添加能在所有这些特性——如 RAII(资源获取即初始化)、模板元编程和底层系统编程——中一致工作的内存安全机制,会给语言设计及其自身实现都增加额外的复杂层次。

多样化的使用场景

  • C++ 被广泛应用于各种领域,从高性能计算到嵌入式系统和实时应用。每个领域都有自己的需求和约束。适用于某一领域的内存安全特性在另一领域可能无法接受,这使得制定一刀切的解决方案十分困难。

由于这些挑战,C++ 标准委员会正在谨慎推进。目前的做法是通过可选的工具或库以增量方式引入安全特性,而不是在语言层面强制执行,让开发者可以选择采用更安全的实践,同时不牺牲 C++ 著称的灵活性和性能。

幸运的是,C++ 标准委员会(WG21)正日益关注内存安全性,相关努力正在进行中,目标是在不牺牲性能的前提下集成编译期安全检查。这一举措有望让 C++ 默认更加安全,解决该语言长期以来在内存管理方面的隐患。

在这场精彩的演讲中,Herb Sutter 更深入地探讨了 C++ 的安全性。

https://youtu.be/EB7yR-1317k?si=K5XnWn7ifYxSLeqf

若想具体了解 C++ 在内存安全方面的未来,您可以参加 Herb Sutter 的线上会议,由MeetingCpp主办。

分享本文