C#通过指针实现快速拷贝的方法

本文实例讲述了C#通过指针实现快速拷贝的方法。分享给大家供大家参考。具体实现方法如下:

// fastcopy.cs
// 编译时使用:/unsafe
using System;
class Test
{
  // unsafe 关键字允许在下列
  // 方法中使用指针:
  static unsafe void Copy(byte[] src, int srcIndex, byte[] dst, int dstIndex, int count)
  {
    if (src == null || srcIndex < 0 ||
      dst == null || dstIndex < 0 || count < 0)
    {
      throw new ArgumentException();
    }
    int srcLen = src.Length;
    int dstLen = dst.Length;
    if (srcLen - srcIndex < count || dstLen - dstIndex < count)
    {
      throw new ArgumentException();
    }
    // 以下固定语句固定
    // src 对象和 dst 对象在内存中的位置,以使这两个对象
    // 不会被垃圾回收移动。
    fixed (byte* pSrc = src, pDst = dst)
    {
      byte* ps = pSrc;
      byte* pd = pDst;
      // 以 4 个字节的块为单位循环计数,一次复制
      // 一个整数(4 个字节):
      for (int n = 0; n < count / 4; n++)
      {
        *((int*)pd) = *((int*)ps);
        pd += 4;
        ps += 4;
      }
      // 移动未以 4 个字节的块移动的所有字节,
      // 从而完成复制:
      for (int n = 0; n < count % 4; n++)
      {
        *pd = *ps;
        pd++;
        ps++;
      }
    }
  }
  static void Main(string[] args)
  {
    byte[] a = new byte[100];
    byte[] b = new byte[100];
    for (int i = 0; i < 100; ++i)
      a[i] = (byte)i;
    Copy(a, 0, b, 0, 100);
    Console.WriteLine("The first 10 elements are:");
    for (int i = 0; i < 10; ++i)
      Console.Write(b[i] + " ");
    Console.WriteLine("\n");
  }
}

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • C#实现屏幕拷贝的方法

    本文实例讲述了C#实现屏幕拷贝的方法.分享给大家供大家参考.具体如下: 方法一: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace Wi

  • 简单谈谈C#中深拷贝、浅拷贝

    Object.MemberwiseClone 方法 创建当前 Object 的浅表副本. protected Object MemberwiseClone() MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象. 如果字段是值类型的,则对该字段执行逐位复制. 如果字段是引用类型,则复制引用但不复制引用的对象:因此,原始对象及其复本引用同一对象. 例如,考虑对象X引用对象 A 和 B , 对象 B 依次引用对象 C. X 的浅表副本

  • C#浅拷贝和深拷贝实例解析

    在有些时候,我们需要从数据库读取数据填充对象或从硬盘读取文件填充对象,但是这样做相对耗时.这时候我们就想到了对象的拷贝.本文即以实例形式解析了C#浅拷贝和深拷贝的用法.具体如下: 一.浅拷贝 1.什么是"浅拷贝": 当针对一个对象前拷贝的时候,对于对象的值类型成员,会复制其本身,对于对象的引用类型成员,仅仅复制对象引用,这个引用指向托管堆上的对象实例. 2.有一个对象,包含引用类型的类成员和值类型的struct成员 Cinema包含引用类型成员Room和值类型成员Film. publi

  • C#中4种深拷贝方法介绍

    1:利用反射实现 public static T DeepCopy<T>(T obj) { //如果是字符串或值类型则直接返回 if (obj is string || obj.GetType().IsValueType) return obj; object retval = Activator.CreateInstance(obj.GetType()); FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | B

  • C#拷贝文件简单实现方法

    本文实例讲述了C#拷贝文件简单实现方法.分享给大家供大家参考.具体分析如下: C#中拷贝文件可以先通过FileInfo指定文件,然后通过FileInfo的CopyTo方法拷贝文件到指定的位置 FileInfo fi = new FileInfo(@"C:\file.txt"); if(fi.Exists) { fi.CopyTo(@"C:\copyfile.txt"); } 希望本文所述对大家的C#程序设计有所帮助.

  • C#运用FileInfo类实现拷贝文件的方法

    本文所述实例为C#运用FileInfo类实现拷贝文件的方法,程序中C#首先创建一个 StreamWriter 对象 writer,它向 FileInfo 的实例 srcFile 所表示的文件追加文本,FileInfo 类的 CopyTo 方法,实现文件的拷贝. 具体实现代码如下: using System; using System.IO; namespace 拷贝文件 { class Class1 { [STAThread] static void Main(string[] args) {

  • c# 深拷贝与浅拷贝的区别分析及实例

    深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响.举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人.比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等. 浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同).对其中任何一个对象的改动都会影响另外一个对象.举个例子,一个人一开始叫张三,后来

  • C# 拷贝数组的几种方法(总结)

    突然学到了,所以就放到博客上来共享一下,权当是学习日记吧. 首先说明一下,数组是引用类型的,所以注意不要在复制时复制了地址而没有复制数值哦! 其实在复制数组的时候,一定要用new在堆中开辟一块新的空间专门用于存放数组,这样才是有效的. (1) int[] pins = { 9, 3, 7, 2 }; int[] copy=new int[pins.length]; for (int i = 0; i < copy.length; i++) { copy[i] = pins[i]; } (2) i

  • C#实现windows form拷贝内容到剪贴板的方法

    本文实例讲述了C#实现windows form拷贝内容到剪贴板的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Data; using System.Windows.Forms; public class MainClass { public static void Main(string[

  • c#深拷贝文件夹示例

    复制代码 代码如下: using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks; namespace FileUtility{    public class Program    {        public static v

随机推荐