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

如何将浮点数组从c#封送到c,然后在c中编辑数组,同时使c#能够立即引用更新的数组,c#,pointers,marshalling,C#,Pointers,Marshalling,我不确定这是否可行,我对c#中的编组不太了解,所以如果我离这很远,或者这是否可行,请告诉我我对这方面的理解 但基本上,我在C#中有一个浮动数组,在基于C#的应用程序中。每次这个程序循环时,我都需要在这个浮动数组上执行一些处理器密集型的繁重工作。因此,我想用C编写这个处理器密集型代码,然后将浮点数组整理到C中,并用C进行编辑。这似乎很简单,但问题是我的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
}

pinvoke marshaller创建数组副本的情况很少。正常封送包括固定数组并传递指向托管浮点[]元素的指针。当您可以在不使用[Out]属性的情况下实际看到C代码所做的更改时,您就可以知道会发生这种情况。不要做假设,先测量。然后,如果你发现了一个反例,就发布代码。