一些注意
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++
String
https://www.cnblogs.com/cthon/p/9181979.html
并发
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