.jpg)
书: https://pan.baidu.com/s/1A6ZLSPMbCiZ-L4eRucUvXQ?pwd=kt7i
一些笔记分享给大家:
一、C语言核心
- “C语言的指针本质是内存地址的容器,
int *p
中*
表示解引用,&
取地址,二者互为逆操作。” - “数组名在多数情况下退化为指针,但
sizeof(arr)
和&arr
是例外,仍保留数组类型信息。”
二、C++面向对象
- “C++的RAII(资源获取即初始化)原则:构造函数分配资源,析构函数释放,避免内存泄漏。”
- “虚函数表(vtable)是多态的核心实现,动态绑定通过运行时查表调用正确覆写方法。”
三、内存管理
- “
malloc
/free
与new
/delete
关键区别:后者调用构造/析构函数,前者仅分配原始内存。” - “内存对齐(Alignment)原则:
struct
成员按最大类型大小对齐,#pragma pack(n)
可强制修改对齐值。”
四、模板与泛型
- “模板特化(Template Specialization)允许为特定类型定制实现,优先级高于通用模板。”
- “SFINAE(替换失败非错误)是模板元编程的基础,利用
decltype
和enable_if
控制重载决议。”
五、多线程与并发
- “
std::atomic
保证操作的原子性,但多原子操作组合仍需锁(如std::mutex
)实现线程安全。” - “条件变量(
std::condition_variable
)的wait
必须搭配谓词检查,避免虚假唤醒(Spurious Wakeup)。”
六、性能优化
- “内联函数(
inline
)通过消除调用开销提升性能,但过度使用会导致代码膨胀(Code Bloat)。” - “缓存友好性(Cache Locality)比减少指令数更重要:连续内存访问(如数组)比随机访问(如链表)快10倍以上。”
七、标准库精髓
- “
std::vector
的扩容策略(通常2倍增长)导致迭代器失效,reserve()
预分配可避免多次复制。” - “智能指针(
std::shared_ptr
)的循环引用问题需用std::weak_ptr
打破,否则内存无法释放。”
八、现代C++特性
- “移动语义(Move Semantics)通过右值引用(
&&
)避免深拷贝,std::move
将左值转为右值。” - “Lambda表达式本质是匿名函数对象,捕获列表(
[=]
/[&]
)决定外部变量的访问方式。”
九、调试与安全
- “未定义行为(UB)如野指针访问、整数溢出,编译器无义务报错,但可能导致灾难性后果。”
- “ASan(AddressSanitizer)工具可检测内存越界、use-after-free,代价是2倍运行速度下降。”
十、设计哲学
- “C++的零开销抽象(Zero-overhead Abstraction):不用的特性不产生额外成本,但滥用模板会违背此原则。”
- “C适合底层硬件操作,C++适合复杂系统建模——选择语言取决于问题域,而非性能偏见。”