make_shared和shared_ptr
【读书笔记之智能指针广度搜索】造成的后果:
noexcept 和 stack unwind 和 FPO
noexcept 声明函数不抛出异常,方便编译器优化(使用move),对于big four(constructor 、 assignment 效果显著)。也可以在编译期对不同类型判断是否会抛出异常。
如果步骤2抛出异常(例如OOM),那么A对象没有被回收,因为此时A对象没有被智能指针管理起来,造成了资源泄露。
这个问题在C++17中得到了解决,C++17对函数参数求值顺序做了规定,规定了函数参数求值需要 fully evaluate后 才能对下一个参数进行求值
保证不抛出异常,编译器就不必进行Exception Handling
FPO1:
问题来源:如何索引栈上变量?
方案一:通过esp进行偏移索引。缺点是esp会发生变动,要求编译器生成的代码更复杂。
方案二:通过ebp进行偏移索引,ebp在一个栈帧中是固定的,更简单。
必须使用ebp的场景
=> 大部分场景 FPO disabled
FPO disabled的好处:可以在缺失符号的情况下,根据ebp,将栈当作链表串起来
FPO的优势:
1. x86寄存器太少,多一个寄存器可以少在栈上分配空间,访存更快
2. 没有保存、恢复ebp的开销,代码提交更小
custom deleter in smart_ptr
关注引起的 smart_ptr size 变化2
Empty Base Optimization
对于空类(不含有 non static 成员变量的类),继承时不占用空间,而组合时占用空间3
推荐阅读
- C++|c++中string的模拟实现
- c++|c++的string类的模拟实现 以及basic_string::_M_construct null not valid错误的原因
- C++|[C/C++]详解STL容器1--string的功能和模拟实现(深浅拷贝问题)
- c++|模拟实现string类
- RBE104TC 分析
- python|来聊聊SourceMap
- 简单搜索|Smallest Difference POJ-2718(全排列)
- 初识C语言|初识C语言(指针)
- CSCI1120