• 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. }

  • 相关阅读:
    Pytorch的variable和tensor区别
    C++语法——map与set的封装原理
    阵列信号处理——研究背景与现状
    java计算机毕业设计基于安卓Android/微信小程序的大学生教学辅导系统APP
    RocketMQ(13)——指定NameServer的四种方式
    List集合中的相邻元素是否满足升序排列
    3D编程模式:依赖隔离模式
    【图形基础篇】01 # 浏览器中实现可视化的四种方式
    Autosar MCAL软件架构基本概念
    SpringBoot入门知识
  • 原文地址:https://blog.csdn.net/weixin_66828150/article/details/132902757