侯捷老师-内存管理和内存分配器笔记

目录

    • 链接:https://www.youtube.com/watch?v=uQ3wKWGmtk0&list=PLRTJhCIMo8HPlzVfZ8uxs6SGSSAtKXQ6Q

    • 所有的内存分配最终都会调用malloc

      • glibc就是直接用的DL Malloc
      • 调用层次:c++程序员 => 标准库容器std::allocator => 标准c++的operator new() => CRT的malloc和free => 操作系统的HeapAlloc和VirtualAlloc
        展开查看
    • 4种分配内存的方式

      • malloc, new, operator::new(), std::allocator
        展开查看
    • new和delete

      • new就是先分配内存,再调用构造函数
        delete先调用析构函数,再释放内存
        • 程序员直接调用构造ctor,需要用placement new
        • 内存不足就new失败,程序员可以写new_handler函数对失败后做处理(只能释放或exit了)
      • new Object关键字其实是调用了::operator new(sizeof(Object))
        • 重载的Object的static operator new一定是静态的
      • new Obj[3]和delete[] ptr会构造,析构
        展开查看 ptr = new Obj[3] : 唤醒3次构造ctor
        delete[] ptr : 唤醒3此析构dtor
        内存泄漏发生在dtor上,而不是delete上
        展开截图
    • 标准库内存管理抽象:allocator分配器

      • 为一个类写内存池怎么做 1. 要分配100个Object,每个Object为8字节
        2. Object类重载operator new函数,每次挖一大块,用嵌入式指针
        3. 直接malloc出100个Object的内存,这样cookie少
        4. 由于每个类都要做一次"重载operator new","挖一大块内存,用嵌入式指针"所以标准库有了通用的allocator
      • 标准库帮我们做了通用的内存池
          std::alloc截图
      • 需要考虑:碎片,战备池,malloc失败后并不会不断除以2而是从已有的上面拿
    • 标准库的allocator有内存池的概念

      • 减少malloc的次数,因为malloc会在头尾带cookie(8字节)
        • 展开查看: 一次malloc一大块内存比分几次malloc小内存要好
    • 使用标准库容器内存占用会更小(cookie少)

    posted @ 2023-06-08 15:33  马角的逆袭  阅读(51)  评论(0编辑  收藏  举报