重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

C#非托管内存的应用(一)——基本数据的拷贝-创新互联

这标题或许有些大,叫做“CSharp非托管内存拷贝转换数据”之类的也许更贴近本文主题。考虑到本文有扩展的可能,就先这样子吧!本篇的内容主要包括:

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:申请域名雅安服务器托管、营销软件、网站建设、西固网站维护、网站推广。

1、简介

2、利用非托管内存转换基本类型数组

1、简介

 C#专门提供了非托管内存操作的功能类System.Runtime.InteropServices.Marshal。做过C/C++互操作的朋友应该对这个类有所了解吧!

 非托管内存使用的好处是方便,能够快速操作内存,在一些类型数据转换的时候能够减少运算量,提升运算速度;缺点就是会花费更多的内存,而且操作非托管内存很容易引起内存泄漏,所以使用的时候需要万分小心,在给程序员带来方便的同时,也会挖下一些隐藏的坑!

 2、利用非托管内存转换基本类型数组

/// 
/// short数组转换成byte数组
/// 
/// 
/// 
/// 要Copy的source数组个数
public static void CopyMemFromShort(short[] source, byte[] target, int sourceLen)
{
    IntPtr tmpPtr = IntPtr.Zero;
    try
    {
        tmpPtr = Marshal.AllocHGlobal(sourceLen * 2);  // 申请内存
        //copy数据到指定非托管内存地址
        Marshal.Copy(source, 0, tmpPtr, sourceLen);
        //copy非托管内存数据到指定byte数组
        Marshal.Copy(tmpPtr, target, 0, sourceLen  * 2);
        Marshal.FreeHGlobal(tmpPtr); // 清空申请的非托管内存
    }
    catch (Exception ex)
    {
        if (tmpPtr != IntPtr.Zero)
            Marshal.FreeHGlobal(tmpPtr);
        throw new Exception("内存操作失败:" + ex.ToString());
    }
}

  当然,大家完全可以用System.Buffer.BlockCopy()方法来实现以上的操作,本方法可以完全当做另一种思路,而且由于会申请额外的空间,在大量数据的copy时候,效率上也不及BlockCopy。

  一般来讲,操作非托管内存的使用步骤包括

 a.申请内存;b.拷贝数据到非托管内存;c.拷贝非托管内存数据到托管内存; d.释放内存。

申请内存

System.IntPtr tmpPtr = Marshal.AllocHGlobal(sourceLen);  // 申请内存

上面的代码就从非托管内存中申请了sourceLen长度的内存(字节为单位),返回的结构体为申请内存地址的指针,申请内存可能出现OutofMemory的异常,使用的时候要注意。

拷贝数据到非托管内存、拷贝非托管内存数据到托管内存

//copy数据到指定非托管内存地址
  Marshal.Copy(source, 0, tmpPtr, sourceLen);
  //copy非托管内存数据到指定byte数组,short->byte 2个字节->1个字节,所以长度要* 2
  Marshal.Copy(tmpPtr, target, 0, sourceLen  * 2);

 以上两个步骤都是用的同一个方法的不同重装。Marshal.Copy既支持从非托管内存Copy数据,也支持将数据Copy到非托管内存,详细介绍可见MSDN文档

释放内存

Marshal.FreeHGlobal(tmpPtr); // 清空申请的非托管内存

 最后释放内存,这一步很重要,用了的非托管内存必须手动释放!

上面的方法只演示了从short[]转换到byte[]的转换,其它转换如byte[]->short[]。int[]->byte[]。int[]->short[]都类似,编码的时候需要将它们在内存中占用的字节数搞清楚,避免内存溢出等问题的出现。

详细的转换代码我会在最后一篇给出,下一篇会说到结构体在内存中的转换方法。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:C#非托管内存的应用(一)——基本数据的拷贝-创新互联
文章源于:http://cqcxhl.com/article/csshec.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP