C# unsafe 指针实现数组快速拷贝

山间有风
山间有风
发布时间:2026-10-13| 3人浏览过
原创

在C#开发中,常规的数组拷贝通常由运行时垃圾回收机制或Array.Copy处理。但在对性能极度敏感的场景下,使用unsafe关键字配合指针直接操作内存可以显著提升拷贝速度。本文详细解析基于指针的内存块拷贝实现逻辑,包括内存固定、整型块加速及余数处理。

实现原理

C#默认的安全环境禁止指针操作。要实现快速的底层内存拷贝,必须满足以下条件:

  1. 启用不安全代码:编译时需添加 /unsafe 标志。
  2. 固定内存位置:使用 fixed 语句防止垃圾回收器移动托管对象的内存地址。
  3. 批量处理策略:优先以 int(4字节)为单位进行赋值,最后处理剩余的不足4字节的字节数据。

核心步骤与代码

第1步:定义带有安全检查的 Copy 方法入口

首先构建一个方法签名,明确源数组、目标数组及其起始索引和待拷贝的长度。在正式操作前,必须进行严格的参数校验,防止越界访问导致程序崩溃。

static unsafe void Copy(byte[] src, int srcIndex, byte[] dst, int dstIndex, int count)
{
    // 1. 基础空值与负数检查
    if (src == null || srcIndex < 0 ||
      dst == null || dstIndex < 0 || count < 0)
    {
        throw new ArgumentException("参数无效");
    }

    // 2. 范围越界检查
    int srcLen = src.Length;
    int dstLen = dst.Length;
    if (srcLen - srcIndex < count || dstLen - dstIndex < count)
    {
        throw new ArgumentException("拷贝长度超出数组边界");
    }

    // 后续内存操作...
}

第2步:使用 fixed 固定内存地址

C#中的引用类型(如数组)可能被GC移动。使用 fixed 语句获取数组首元素的指针,并在该作用域内保持指针有效。

// 固定源和目标数组的内存位置
fixed (byte* pSrc = src, pDst = dst)
{
    byte* ps = pSrc; // 源指针
    byte* pd = pDst; // 目标指针
    
    // ... 执行拷贝逻辑 ...
} // 离开此作用域后,固定自动解除,允许GC移动对象

第3步:循环执行4字节块拷贝

为了提升效率,将连续4个字节视为一个 int 类型进行一次性拷贝。循环次数为总长度除以4的商。

// 以 4 个字节的块为单位循环计数
for (int n = 0; n < count / 4; n++)
{
    *((int*)pd) = *((int*)ps); // 强制类型转换并赋值
    pd += 4;
    ps += 4;
}

第4步:处理余数字节

如果总拷贝长度不能被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#通过指针实现快速拷贝的详细内容,更多关于C# Unsafe与内存优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。