zoukankan      html  css  js  c++  java
  • 条目十一《理解自定义分配子的合理用法》

    条目十一《理解自定义分配子的合理用法》

    根据大牛们的测试:

    STL默认的内存管理器(allocator)太慢,或者浪费内存,或者在使用的时候会产生内存碎片。

    又或者需求不一样时:

    1.allocator是多线程安全的,而你运行环境是单线程,所以想减少线程同步带来的te不必要开销。
    2.当想把容器的对象放到一个特殊堆的相邻位置,做到引用局部优化。
    3.建立一个共享内存相对应的特殊堆,在这块内存存放一个或多个容器,以便其他进程库共享这些容器

    由于以上的STL默认的分配子allocator为了兼顾绝大多数应用场景,造成的性能中庸,我们可以根据实际的需求而自定义容器的分配子(allocator)。

    template<typename T>
    class MyAllocator {
        pointer allocate(size_type numObjects, const void* localtyHint = 0)
        {
            ...
        }
    
        void deallocate(pointer ptrToMemory, size_type numObjects)
        {
            ...
        }
    };
    
    typedef DateType int;
    typedef vector<DateType, MyAllocator<DateType> > MyVector;
    
    MyVector vec;
    

    通过对allocate和deallocate两个成员函数的重写,就可以达到自定义分配子的目的。

    例子:
    • 1.建立一个共享容器内存块。(1.memget申请一块共享内存。2.在共享内存中构造一块内存作为容器的对象存放内存空间。3.析构共享内存里的对象。4.释放共享内存free。)

    对于条目十和条目十一,其实掌握的还是一般,后面阅读《stl源码剖析》再深入学习吧。

    参考:

    《Effective STL》

  • 相关阅读:
    GD32E507移植FreeRTOS
    FreeRTOS学习笔记——任务基础知识
    FreeRTOS学习笔记——系统配置
    am335x WG209 wifi模块自动配置的脚本
    树莓派学习笔记——Systemd进程启动
    am335x WG209 wifi模块驱动移植
    树莓派学习笔记——搭建Samba服务端
    树莓派学习笔记——内核编译
    一个复制文件的Shell脚本
    Makefile学习笔记——Makefile通配符的使用
  • 原文地址:https://www.cnblogs.com/liangjf/p/10258266.html
Copyright © 2011-2022 走看看