
书: https://pan.baidu.com/s/15VfTw9eJ2MoiHktwswP0gw?pwd=tq5x
笔记如下:
一、设计初衷
- “C++的诞生目标:将Simula的组织能力与C的系统编程效率结合,同时保持对硬件的直接控制。”
- “C with Classes(早期C++)的核心创新:类(Class)和构造函数,但保留C的底层能力。”
二、语言演化原则
- “零开销抽象(Zero-overhead Principle):用户定义的类不应比手写C代码效率更低。”
- “渐进式兼容:C++必须与C保持高度兼容,但逐步引导用户使用更安全的特性(如
nullptr
替代NULL
)。”
三、关键特性起源
- “虚函数(Virtual Function)的引入源于1982年,为支持运行时多态,但避免Smalltalk的动态类型开销。”
- “模板(Template)的灵感来自Ada泛型,但C++模板是图灵完备的编译时机制。”
四、面向对象设计
- “多重继承的争议:Stroustrup最初反对,但因现实需求(如接口分离)妥协,后通过虚基类优化。”
- “RAII(资源获取即初始化)是C++区别于GC语言的核心:资源生命周期绑定对象作用域。”
五、标准化历程
- “C++98标准化的两大焦点:标准化模板和异常机制,但
export template
因实现困难最终被弃用。” - “C++11的‘现代C++’革命:
auto
、lambda、移动语义的加入,源于长期社区实践反馈。”
六、模板元编程
- “模板元编程(TMP)是意外发现:1994年Erwin Unruh演示编译时素数计算,非最初设计目标。”
- “概念(Concepts)的曲折:C++20最终引入,旨在解决模板错误信息的不可读性。”
七、错误处理哲学
- “异常机制的妥协:既要保证错误处理结构化,又避免Java式强制异常声明的繁琐。”
八、与C的决裂与共存
- “C++拒绝完全脱离C的‘干净断代’:现实代码库的迁移成本高于理论优雅性。”
九、性能与抽象的平衡
- “内联函数(
inline
)的初衷:允许抽象(如访问器)不牺牲性能,但现代编译器已自主决策内联。”
十、未来方向
- “模块(Modules)的愿景:终结
#include
导致的编译时代价,但需数十年生态迁移。” - “静态反射(Reflection)的挑战:如何在编译时暴露类型信息而不破坏零开销原则。”
十一、设计教训
- “最深刻的教训:特性易增难删,即使
export
这样极少使用的特性也需长期支持。”
十二、语言哲学
- “C++的终极目标:成为解决现实问题的工具,而非追求理论纯粹性。”
- “成功的语言设计是约束下的艺术:兼容性、性能、可用性、实现复杂性的多维权衡。”