C# 中的不安全代码(unsafe code)和指针操作

1️⃣C#代码片段如下:

 int a=1000,b=8;
 double[,] output = new double[a, b];
 double [,]data=new double[a*128,b] 

  unsafe
  {
      fixed (double* dataBasePtr = &data[0, 0])
      {
          // dataBasePtr 指向 data 数组的起始地址
          // 可以用指针做高效访问
      }
  }


  • fixed 可以 固定数组在内存中的位置,防止垃圾回收移动它

  • 然后 dataBasePtr 就可以像 C/C++ 的指针一样,直接访问数组元素

2️⃣这样写的好处是:

  • 高性能访问:用指针访问数组时,不需要每次都经过数组边界检查(bounds checking),尤其是循环访问大量元素时性能明显提升。

  • 连续内存操作:可以用 memcpy、Span 或 SIMD 指令直接处理一块连续内存。

  • 方便与非托管 API 交互:例如调用 C/C++ DLL、OpenCV、HDF5 库时,通常需要传递数组指针。

3️⃣适用场景

  • 高频数值计算:例如你之前提到的 2M/s 数据采集,每个通道有大量 double 数据,遍历二维数组会有性能开销,用指针可减少开销。

  • 大数组批量操作:比如做矩阵运算、FFT、卷积等。

  • 与底层硬件或非托管库交互:例如调用本地 DLL,需要 double* 类型。

⚠️ 注意事项

  • 使用指针会失去 C# 的安全性,需要加 unsafe。

  • 内存越界访问风险大,要自己保证索引安全。

  • 不适合普通业务逻辑,主要用于性能优化或底层接口。

posted @ 2025-10-27 12:08  青云Zeo  阅读(10)  评论(0)    收藏  举报