栈:函数开辟,局部变量
堆:内存申请
全局存储区:全局变量
静态存储区:static
常量存储区:存放常量不能修改
代码区:存放代码
频繁使用new malloc 会造成大量的内存碎片,导致性能下降
内存池就是在真正使用内存前,先申请分配一定数量的,大小相等的内存块作为备用,当有内存的需求时就从内存池取,不够就申请新的内存。
dynamic_cast转换可以判断子类是该基类
-O -O0 -O1 -O2 -O3 四级优化
0不做任何优化,适用于debug阶段
1对代码分支,常量和表达式进行优化
2寄存器级的优化,编译期间占用更多的内存和编译时间
3伪寄存器网络,内联函数,循环优化
s代码大小的优化,基本不用关心,优化会打乱程序的结构
快慢指针方法
atuo_ptr:被废弃,会出现空指针访问
unique_ptr:独占资源所有权的指针
离开指针的作用域时自动释放内存
share_ptr:共享资源所有权的指针
对资源做引用计数,计数为0时自动释放。
内存开销比裸指针和无自定义的unique_ptr对象略大
维护的信息有两部分:指向共享资源的指针,指针控制信息的指针。
共享的指针都要指向两个部分的指针。
weak_ptr:共享资源的观察者,和share_ptr一起使用,不影响资源的生命周期
weak是share的观察者,要用weak正在观察的资源,就可以提升为share
如果share管理的对象被释放,weak_ptr就会变成nullptr
只要weak对象还存在,就可以知道share资源还在不在,通过控制块观察对象还在不在
不会增加计数,解决share思索的问题
enable_shared_from_this:成员函数获取this的shared_ptr正确方法是继承
- class Bar : public std::enable_shared_from_this<Bar> {
- public:
- std::shared_ptr<Bar> GetSPtr() {
- return shared_from_this();
- }
- };
-
- auto sptr1 = std::make_shared<Bar>();
- assert(sptr1.use_count() == 1);
- auto sptr2 = sptr1->GetSPtr();
- assert(sptr1.use_count() == 2);
- assert(sptr2.use_count() == 2);