C++语言的设计和演化(本贾尼·斯特劳斯特)

书: https://pan.baidu.com/s/15VfTw9eJ2MoiHktwswP0gw?pwd=tq5x
笔记如下:

一、设计初衷

  1. “C++的诞生目标:将Simula的组织能力与C的系统编程效率结合,同时保持对硬件的直接控制。”
  2. “C with Classes(早期C++)的核心创新:类(Class)和构造函数,但保留C的底层能力。”

二、语言演化原则

  1. “零开销抽象(Zero-overhead Principle):用户定义的类不应比手写C代码效率更低。”
  2. “渐进式兼容:C++必须与C保持高度兼容,但逐步引导用户使用更安全的特性(如nullptr替代NULL)。”

三、关键特性起源

  1. “虚函数(Virtual Function)的引入源于1982年,为支持运行时多态,但避免Smalltalk的动态类型开销。”
  2. “模板(Template)的灵感来自Ada泛型,但C++模板是图灵完备的编译时机制。”

四、面向对象设计

  1. “多重继承的争议:Stroustrup最初反对,但因现实需求(如接口分离)妥协,后通过虚基类优化。”
  2. “RAII(资源获取即初始化)是C++区别于GC语言的核心:资源生命周期绑定对象作用域。”

五、标准化历程

  1. “C++98标准化的两大焦点:标准化模板和异常机制,但export template因实现困难最终被弃用。”
  2. “C++11的‘现代C++’革命:auto、lambda、移动语义的加入,源于长期社区实践反馈。”

六、模板元编程

  1. “模板元编程(TMP)是意外发现:1994年Erwin Unruh演示编译时素数计算,非最初设计目标。”
  2. “概念(Concepts)的曲折:C++20最终引入,旨在解决模板错误信息的不可读性。”

七、错误处理哲学

  1. “异常机制的妥协:既要保证错误处理结构化,又避免Java式强制异常声明的繁琐。”

八、与C的决裂与共存

  1. “C++拒绝完全脱离C的‘干净断代’:现实代码库的迁移成本高于理论优雅性。”

九、性能与抽象的平衡

  1. “内联函数(inline)的初衷:允许抽象(如访问器)不牺牲性能,但现代编译器已自主决策内联。”

十、未来方向

  1. “模块(Modules)的愿景:终结#include导致的编译时代价,但需数十年生态迁移。”
  2. “静态反射(Reflection)的挑战:如何在编译时暴露类型信息而不破坏零开销原则。”

十一、设计教训

  1. “最深刻的教训:特性易增难删,即使export这样极少使用的特性也需长期支持。”

十二、语言哲学

  1. “C++的终极目标:成为解决现实问题的工具,而非追求理论纯粹性。”
  2. “成功的语言设计是约束下的艺术:兼容性、性能、可用性、实现复杂性的多维权衡。”

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注