C#的动态内存管理类

news/2024/7/20 14:15:23 标签: 内存, 内存管理, c#

前两天看到的一个c#内存管理 DynamicBufferManager.cs

稍微阉割了一下

using System;

namespace IOCPLib.IOCP
{
    public class DynamicBufferManager
    {
        public byte[] Buffer { get; set; } //存放内存的数组
        public int DataCount { get; set; } //写入数据大小

        public DynamicBufferManager(int bufferSize)
        {
            DataCount = 0;
            Buffer = new byte[bufferSize];
        }

        public int GetDataCount() //获得当前写入的字节数
        {
            return DataCount;
        }

        public int GetReserveCount() //获得剩余的字节数
        {
            return Buffer.Length - DataCount;
        }

        public void Clear(int count) //清理指定大小的数据
        {
            if (count >= DataCount) //如果需要清理的数据大于现有数据大小,则全部清理
            {
                DataCount = 0;
            }
            else
            {
                for (int i = 0; i < DataCount - count; i++) //否则后面的数据往前移
                {
                    Buffer[i] = Buffer[count + i];
                }
                DataCount = DataCount - count;
            }
        }

        public void WriteBuffer(byte[] buffer, int offset, int count)
        {
            if (GetReserveCount() >= count) //缓冲区空间够,不需要申请
            {
                Array.Copy(buffer, offset, Buffer, DataCount, count);
                DataCount = DataCount + count;
            }
            else //缓冲区空间不够,需要申请更大的内存,并进行移位
            {
                int totalSize = Buffer.Length + count - GetReserveCount(); //总大小-空余大小
                byte[] tmpBuffer = new byte[totalSize];
                Array.Copy(Buffer, 0, tmpBuffer, 0, DataCount); //复制以前的数据
                Array.Copy(buffer, offset, tmpBuffer, DataCount, count); //复制新写入的数据
                DataCount = DataCount + count;
                Buffer = tmpBuffer; //替换
            }
        }

        public void WriteBuffer(byte[] buffer)
        {
            WriteBuffer(buffer, 0, buffer.Length);
        } 
    }
}


异步发送的内存管理类AsyncSendBufferManager.cs

using System;
using System.Collections.Generic;

namespace IOCPLib.IOCP
{
    struct SendBufferPacket  //记录每个包在内存中的offset和包长
    {
        public int Offset;
        public int Count;
    }

    //发送需要等待上一次回调才发下一次的响应,由于用于异步发送,可能同时多个数据写入内存
    public class AsyncSendBufferManager
    {
        private DynamicBufferManager m_dynamicBufferManager;
        public DynamicBufferManager DynamicBufferManager
        { get { return m_dynamicBufferManager; } }

        private List<SendBufferPacket> m_sendBufferList; //发送的数据包s
        private SendBufferPacket m_sendBufferPacket;

        public AsyncSendBufferManager(int bufferSize)
        {
            m_dynamicBufferManager = new DynamicBufferManager(bufferSize);
            m_sendBufferList = new List<SendBufferPacket>();
            m_sendBufferPacket.Offset = 0;
            m_sendBufferPacket.Count = 0;
        }

        public void StartPacket() //StartPacket 和 EndPacket 成对调用
        {
            m_sendBufferPacket.Offset = m_dynamicBufferManager.DataCount;
            m_sendBufferPacket.Count = 0;
        }

        public void EndPacket()
        {
            m_sendBufferPacket.Count = m_dynamicBufferManager.DataCount - m_sendBufferPacket.Offset;
            m_sendBufferList.Add(m_sendBufferPacket);
        }

        public bool GetFirstPacket(ref int offset, ref int count)
        {
            if (m_sendBufferList.Count <= 0)
                return false;
            offset = m_sendBufferList[0].Offset;
            count = m_sendBufferList[0].Count;
            return true;
        }

        public bool ClearFirstPacket()
        {
            if (m_sendBufferList.Count <= 0)
                return false;
            int count = m_sendBufferList[0].Count;
            m_dynamicBufferManager.Clear(count);
            m_sendBufferList.RemoveAt(0);
            return true;
        }

        public void ClearPacket()
        {
            m_sendBufferList.Clear();
            m_dynamicBufferManager.Clear(m_dynamicBufferManager.DataCount);
        }
    }
}
调用方法 如下:
AsyncSendBufferManager asyncSendBufferManager = m_asyncUserToken.SendBuffer; //初始化 
asyncSendBufferManager.StartPacket();//StartPacket 和 EndPacket 成对
asyncSendBufferManager.DynamicBufferManager.WriteBuffer(head.GetBuffer(), 0, (int)head.Length);//head和body为两个数据写入一个buffer
asyncSendBufferManager.DynamicBufferManager.WriteBuffer(body.GetBuffer(), 0, (int)body.Length);
asyncSendBufferManager.EndPacket();  

以上可用于异步socket收发的内存管理


http://www.niftyadmin.cn/n/1243674.html

相关文章

我的Android进阶之旅------Java全角半角的转换方法

一中文全角和半角输入的区别 1全角指一个字符占用两个标准字符位置2半角指一字符占用一个标准的字符位置3全角与半角各在什么情况下使用4全角和半角的区别5关于全角和半角6全角与半角比较二转半角的方法DBC case三转全角的方法SBC case一、中文全角和半角输入的区别 在计算机屏…

我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法

我的Android进阶之旅------>Android颜色值(RGB)所支持的四种常见形式透明度百分比和十六进制对应关系表格 透明度十六进制100%FF99%FC98%FA97%F796%F595%F294%F093%ED92%EB91%E890%E689%E388%E087%DE86%DB85%D984%D683%D482%D181%CF80%CC79%C978%C777%<

SQL语句优化实践

一、一些常见的SQL实践 &#xff08;1&#xff09; 负向条件查询不能使用索引 select * from order where status!0 and stauts !1 not in / not exists 都不是好习惯 可以优化为in查询&#xff1a; select * from order where stauts in(2,3) &#xff08;2&#xff09…

我的Android进阶之旅------>解决Error:Unable to find method ‘org.gradle.api.internal.project.ProjectInternal.g

#错误描述 今天在Github上面下载了一份代码,然后导入到Android Studio中直接报了如下图所示的错误: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MX05cl6L-1660292797736)(https://img-blog.csdn.net/20160725205332917)] 错误描述如下: Error:…

设计模式-第一章-简单工厂模式

一、UML图 二、包含的角色 简单工厂模式包含三个角色&#xff1a; &#xff08;1&#xff09;工厂类Factory&#xff1a;工厂类是用来制造产品的。因此&#xff0c;在Factory中有一个用于制造产品的Create函数或者Generate函数之类的函数&#xff08;这里的CreateProduct&…

我的Android进阶之旅------解决Error: specified for property 'mergedManifest' does not exist.

错误描述 刚运行从Github上面下载而来的代码时,爆了如下所示的bug,错误描述如下所示: Error:A problem was found with the configuration of task :app:generateDebugInstantRunAppInfo. > File F:\Multi-Thread Download\MultiThreadDownload\app\build\intermediates…

我的Android进阶之旅------解决DownloadManager报错java.lang.SecurityException: Invalid value for visibility: 2

1、问题描述 今天使用Android系统的DownloadManager进行下载操作时,爆了如下所示的错误: java.lang.RuntimeException: Unable to start service com.xtc.fm.qingting.services.QingtingFmDownloadService2@1b97b060 with Intent { act=com.xtc.fm.qingting.FM_DOWNLOAD_SE…

设计模式-第二章-策略模式

一、UML图 二、包含的角色 策略模式包含三个角色&#xff1a; &#xff08;1&#xff09;策略类Strategy&#xff1a; 策略类定义所有支持的算法的公共接口 &#xff08;2&#xff09;具体策略类ConcreteStrategy&#xff1a;具体策略类&#xff0c;封装了具体算法或行为&am…