C++基本组件之内存池详解

 更新时间:2023年03月01日 11:20:57   作者:牵着我的猪去看海  
这篇文章主要为大家详细介绍了C++中的基本组件——内存池的相关知识,文中的示例代码讲解详细,对我们学习C++有一定的帮助,需要的可以参考一下

脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用

内存池概念

1:尽量减少malloc的次数

2:频繁申请小块内存空间都造成空间的极大浪费

3:利用new和delete运算符重载,替代系统调用

4:减少malloc的次数,可在一定程度上提高效率

5:用malloc申请一个大块内存,从一大块内存中,一点点分配给用户

6:当一大块快用光了,再申请一大块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <malloc.h>
#include <time.h>
using namespace std;
namespace _nm1
{
    //内存池
    //减少malloc的次数,减少对内存的浪费
    //尤其是频繁地申请小块内存
    //速度和效率的提升并不是特别明显,因为malloc的速度也不慢
    //用malloc申请
    //一个大块内存,从一大块内存中,一点点分配给用户
    //当一大块快用光了,再申请一大块
    class A
    {
    public:
        static void *operator new(size_t size);
        //静态成员函数,属于类,不属于对象
        static void operator delete(void *phead);
        static int m_iCout;//分配计数统计
        static int m_iMallocCount;//malloc次数统计
    private:
        A *next;//指针域,指向下一个空间
        static A* m_FreePosi;//总是指向一块分配出去的内存首地址
        static int m_sTrunkCout;//一次分配多少倍
    };
    int A::m_iCout = 0;//初始化
    int A::m_iMallocCount = 0;
 
 
    A *A::m_FreePosi = nullptr;
    int A::m_sTrunkCout = 5;//一次分配五倍
    void * A::operator new(size_t size)
    {
        //核心实现代码
        A* templink;
        if (m_FreePosi == nullptr)
        {
            //待分配内存为空时
            size_t realsize = m_sTrunkCout*size;//一次五倍
            m_FreePosi = reinterpret_cast<A*>(new char[realsize]);
            //一次向系统要5倍的类A字节数大小,不是递归,系统new
            templink = m_FreePosi;
            //将分配出来的内存,彼此之间链表串起来
            for (; templink != &m_FreePosi[m_sTrunkCout - 1]; ++templink)
            {
                //链到最后一个节点空间,结束
                templink->next = templink + 1;
            }
            templink->next = nullptr;
            ++m_iMallocCount;//统计次数
        }
        templink = m_FreePosi;
        m_FreePosi = m_FreePosi->next;
        //既然已经将templink成功返回回去了,就指向下一个能用的内存块
        ++m_iCout;
        return templink;//返回能有的下一块内存
 
    }
    void A::operator delete(void * phead)
    {
        (static_cast<A*>(phead)->next) = m_FreePosi;
        //将当前要释放的节点指针,指向我下一个空闲块
        m_FreePosi = static_cast<A*>(phead);//始终指向下一个能分配的内存块
        //将m_FreePosi可用空闲块的指针,直接指向了当前要释放的节点
        //意味着后面来申请了,可以直接将这块空间覆盖
        //前面Phead->next已经指向了下一个空闲块,所以m_FreePosi可以直接next到
    }
    void func()
    {
        //测试代码
        clock_t start, end;
        start = clock();
        for (int i = 0; i < 500; i++)
        {
            A *pa = new A();//重载了new
        }
        end = clock();
        cout << "申请分配内存的次数" << A::m_iMallocCount << endl;
        cout << end - start << endl;//测试内存池所用时间
    }
     
    void func1()
    {
        //测试代码
        clock_t start, end;
        start = clock();
        for (int i = 0; i < 5000000; i++)
        {
            A *pa = ::new A();//重载了new
        }
        end = clock();
         
        cout << end - start << endl;//测试普通new所用时间
    }
}
int main()
{
    //_nm::func();
    _nm1::func();
    _nm1::func1();
    getchar();
}

到此这篇关于C++基本组件之内存池详解的文章就介绍到这了,更多相关C++ 内存池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/qq_46495964/article/details/123695687

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • C语言超详细讲解数据结构中的线性表

    C语言超详细讲解数据结构中的线性表

    线性表,数据结构中最简单的一种存储结构,专门用于存储逻辑关系为"一对一"的数据。线性表是基于数据在实际物理空间中的存储状态,又可细分为顺序表(顺序存储结构)和链表
    2022-05-05
  • C++ STL入门教程(1) vector向量容器使用方法

    C++ STL入门教程(1) vector向量容器使用方法

    这篇文章主要为大家详细介绍了C++ STL入门教程第一篇,vector向量容器使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Qt音视频开发之利用ffmpeg实现倍速播放

    Qt音视频开发之利用ffmpeg实现倍速播放

    这篇文章主要为大家详细介绍了在Qt音视频开发中如何利用ffmpeg实现倍速播放功能(半倍速/2倍速/4倍速/8倍速),感兴趣的小伙伴可以了解一下
    2022-11-11
  • C++ 指针传递的作用小结

    C++ 指针传递的作用小结

    本文主要介绍了C++ 指针传递的作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • c++中引用和指针的区别和联系

    c++中引用和指针的区别和联系

    许多人对于引用和指针的区别与联系很纠结(包括我在内O(∩_∩)O哈哈~),最近看到一篇关于引用和指针区别和联系的文章,感觉茅塞顿开,在这里和大家分享下
    2014-04-04
  • 双向链表插入删除基本应用介绍

    双向链表插入删除基本应用介绍

    本文将详细介绍建立双向链表,实现对双向链表的插入,删除操作,需要了解的朋友可以参考下
    2012-11-11
  • C语言中进行大小写字母转化的示例代码

    C语言中进行大小写字母转化的示例代码

    C语言标准库中提供了用于大小写转换的函数,使得这一操作变得简单而高效,本文将详细介绍如何在C语言中进行大小写字母的转换,包括相关的函数和示例代码,需要的朋友可以参考下
    2024-03-03
  • C++实现批量图片拼接

    C++实现批量图片拼接

    这篇文章主要为大家详细介绍了C++实现批量图片拼接,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Qt QStandardItemModel用法小结

    Qt QStandardItemModel用法小结

    QStandardItemModel可用作标准Qt数据类型的存储库,本文主要介绍了Qt QStandardItemModel用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • C++中的位运算和位图bitmap解析

    C++中的位运算和位图bitmap解析

    这篇文章主要介绍了C++中的位运算和位图bitmap,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论