• C++--简单实现定长内存池


    1.什么是定长内存池

            在C/C++中,动态申请内存都是通过malloc来申请的,但是实际上不是是直接从堆上直接申请的内存,而是通过malloc动态申请一大块内存,malloc就相当于一块内存池,然后分给程序使用,如果申请的内存使用完或者不够需要申请的内存超过当前剩余的内存的时候,再去向操作系统申请内存。

            内存池主要解决的是在动态申请内存的时候,解决效率的问题,当然,还可以解决一些内存碎片化问题。

            定长内存池就是通过malloc向操作系统申请一大块内存,然后分给需要使用的程序使用。用完之后还给内存池的行为。但是,功能单一,只能解决定长的内存需求,另外占着内存没有释放。
    其基本结构如下:

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. using std::cout;
    6. using std::cin;
    7. using std::endl;
    8. namespace sss
    9. {
    10. template<class T>
    11. class Objectpool
    12. {
    13. public:
    14. T* New()//开辟大小
    15. {
    16. T* obj = nullptr;
    17. //内存重复利用
    18. if (_freeleft)
    19. {
    20. void* next = *(void**)_freeleft;
    21. obj = (T*)_freeleft;
    22. _freeleft = next;
    23. }
    24. //开辟空间
    25. else if (_reminBytes <sizeof(T))
    26. {
    27. _reminBytes = 128 * 1024;
    28. _memory = (char*)malloc(_reminBytes);
    29. if (_memory == nullptr)//判断是否为空
    30. {
    31. throw std::bad_alloc();//抛异常
    32. }
    33. }
    34. obj = (T*)_memory;
    35. size_t objSize = sizeof(T) < sizeof(void*)
    36. ? sizeof(void*) : sizeof(T);
    37. //保证在32位或64位下性能正常使用,因为一个指针最小为4字节
    38. _memory += sizeof(T);//往后加内存
    39. _reminBytes -= sizeof(T);//剩余内存
    40. //定位new;
    41. new(obj)T;//调用T的构造函数
    42. return obj;
    43. }
    44. void Delete(T* obj)//释放内存
    45. {
    46. obj->~T();
    47. /*if (_freeleft == nullptr)
    48. {
    49. _freeleft = obj;
    50. obj = nullptr;
    51. }*/
    52. //头插
    53. *(void**)obj =_freeleft;//32位64位都可以运行
    54. _freeleft = obj;
    55. }
    56. private:
    57. char* _memory;//开辟的大小
    58. size_t _reminBytes=0;//剩余的大小
    59. void* _freeleft;//
    60. };
    61. }

  • 相关阅读:
    django搭建博客十博客首页
    TP5 模型更新的返回值、返回值的判断以及所使用的SQL
    智能座舱概述
    python中的map函数
    串口波形分析
    Hive 基本操作
    WinHex使用方法详解
    javascript: weekOfYear 获取某天所处的一年中的周数
    (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
    AIGC程序员效能提升之道
  • 原文地址:https://blog.csdn.net/weixin_66828150/article/details/132902757