如何将浮点数组从c#封送到c,然后在c中编辑数组,同时使c#能够立即引用更新后的数组

本文关键字:数组 更新 编辑 引用 然后 | 更新日期: 2024-10-19 19:36:01

我不确定这是否可能,我对c#中的封送处理不太了解,所以如果我离这还很远,或者这是否可能的话,请填写我对此的理解。

但基本上,我在C#中有一个浮动数组,在一个基于C#的应用程序中。每次这个程序循环时,我都需要对这个浮点数组进行一些处理器密集型的繁重工作。所以我想用C编写这个处理器密集的代码,然后将浮点数组整理到C中,并在C中进行编辑。这看起来很简单,但问题是我的C#代码需要立即访问在C中编辑的浮点数组。

我遇到的问题是编组的开销。性能上的任何提高都会在编组过程中丢失。如果我必须将这个浮点数组从C#编组到C,然后在这个程序的每个周期从C编组回C#,那么就不会有任何性能增益。

有没有什么方法可以让我制作一个浮点数组,并将指向该数组的指针封送到C,然后在C中编辑该数组。但也可以使用C#中的相同指针立即引用该数组,并查看数组中的C代码发生了什么变化?那么我就不必在每个周期来回整理阵列了吗?

如何将浮点数组从c#封送到c,然后在c中编辑数组,同时使c#能够立即引用更新后的数组

您可以使用固定块。这将阻止垃圾收集器移动内存中的数组。因此,您将获得一个指向可以使用的托管数组的原始指针。将原始指针传递到C代码。无需复制:C代码将直接在托管阵列上操作。一旦固定块超出范围,就不要保留原始指针,否则GC运行后可能会保留一个坏指针。

示例:

int[] arr;
// NOT SHOWN:  initialize arr array
fixed (int* p = arr) {
    // NOT SHOWN:  call C function, passing "p" pointer
}