C++学习笔记
2022-03-02

一些注意

member initialization list 的初始化顺序由class中member声明顺序决定,而不是list本身的顺序

大多数平台上,所有类型的指针具有相同的二进制表述

const_cast关键字用于指针或引用,只能去除底层const,即把一个指向const int类型的指针改成指向int类型的指针,不能将指针的顶层const去除, 也不能将指向的对象的const属性去除

一些思考

指针存储了地址,其类型只决定编译器以何种长度访问内存,如int *在64位机器上以4字节为长度

  • void *只有地址信息,无法解引(和void实际上没关系,void表示没有参数或没有返回值)
  • int *可以隐式转换为void *,因为事实上丢失了长度信息
  • void *只能强制显示转换为int *,这事实上增加了信息,只有编程者知道

了解C++类库相关实现十分重要,使用高级工具和直接低级工具存在开销差,这个开销差就是抽象代价(abstraction penalty)。

某些情况下,高级工具会提供一些额外的功能。大部分情况下这都不是问题,因为你没有为你不使用的那部分买单。在罕见的情况下,这些未使用的功能会影响其他代码的性能。如果你很看重程序的性能,并且高级工具带来的开销过高,你最好是通过较低级别的工具来手工实现你需要的功能。在绝大多数情况下,额外增加的复杂性和出错几率都远大于性能的小幅提升带来的收益。

一些问题

Q: inline函数能取地址吗?

A: 能,但这样代码中会生成一个函数本体用于取地址(通过函数指针调用通常不会被inline),即使在直接调用处是展开的

Q: 虚函数能inline吗?

A: 不能,虚函数是运行时才能确定调用哪个具体的函数,而inline是在编译期对函数进行展开,这两个概念本质上是矛盾的

Q: 没有定义copy constructor ,但有 default constructor,函数按值返回会发生什么?

A: 使用编译器默认产生的copy constructor,bitwise拷贝或memberwise拷贝,但可能不是我们预期的结果(不是深拷贝)

Q: 基类虚函数,子类虚函数同名不同参数(重载?)会发生什么问题?

A: 通过基类指针只能调用到基类的函数,无论该指针指向的是基类还是派生类,如果使用基类指针调用子类同名重载函数,编译不通过

Q: new [] 一个数组,长度信息存储在哪?malloc的长度信息能被获取?

A: 编译器将new分解为两个动作,operator new(size) 和 构造函数,向operator new传递申请的字节数时会多一些额外空间存储数组长度(用于delete时调用析构函数),operator new默认调用malloc申请,而malloc本身也维护了一个区块的大小(Cookie),但malloc并不知道是否该区块是否为数组

Q: new [] 一个数组,用delete释放会发生什么

A: 对于具有平凡的析构函数的类(包括基本类型),不会发生什么,delete依然能够是否对应申请时长度的空间(因为是由free实现),但对于那些需要在析构函数中释放相关资源的类,由于使用delete,不能进行正确次数的调用析构函数,可能出现资源泄露

Q: 虚函数,基类和派生类返回值类型不同?

一些名词

缩略语 全称 中文
SFINAE Substitution Failure Is Not An Error 替换失败并非错误
RAII Resource Acquisition Is Initialization 资源获取即初始化
RTTI Run-Time Type Identification 运行时类型识别
pImpl pointer to implementation
NVI Non-Virtual Interface(一种称为模板方法的设计模式,和C++模板没关系)
(N)RVO (Named) Return Value Optimization (命名)返回值优化
EBO Empty Base Optimization 空白基类优化
stack unwinding 栈展开

一些参考

https://www.zhihu.com/column/c_1306966457508118528

https://zhuanlan.zhihu.com/p/378355217

https://zhuanlan.zhihu.com/p/377145104

Modern C++

https://docs.microsoft.com/en-us/cpp/cpp/welcome-back-to-cpp-modern-cpp?view=msvc-170&viewFallbackFrom=vs-2019

String

https://www.cnblogs.com/cthon/p/9181979.html

知无涯之std::sort源码剖析

并发

https://paul.pub/cpp-memory-model/

https://paul.pub/cpp-concurrency

https://gaomf.cn/2020/09/11/Cpp_Volatile_Atomic_Memory_barrier/

https://www.cnblogs.com/ishen/p/13200838.html

https://zhuanlan.zhihu.com/p/43526907

https://zhuanlan.zhihu.com/p/41872203

协变

https://www.jianshu.com/p/db76a8b08694

搜索
背景设置