c# - 如何将 float 组从 c# 编码到 c,然后在 c 中编辑数组,同时让 c# 能够立即引用更新后的数组

标签 c# pointers marshalling

我不确定这是否可行,我对 C# 中的编码了解不多,所以如果我离题太远,或者这是否可能,请补充我对此的理解。

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

我遇到的问题是编码(marshal)处理的开销。任何性能提升都会在编码过程中丢失。如果我必须将此 float 组从 C# 编码到 C,然后在该程序的每个循环中从 C 返回到 C#,则不会有任何性能提升。

有什么方法可以创建一个 float 组并将指向该数组的指针编码到 C 中,并在 C 中编辑该数组。但也能够使用 C# 中的相同指针立即引用该数组并查看 C 代码在数组中发生了什么变化?那么我就不必在每个周期来回编码数组了吗?

最佳答案

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

例子:

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

关于c# - 如何将 float 组从 c# 编码到 c,然后在 c 中编辑数组,同时让 c# 能够立即引用更新后的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11836170/

相关文章:

c# - 将引用类型从 C++ 编码到 C#

c# - WCF 多重绑定(bind)

c# - 继续过滤/查询分组依据到对象?

C++:类问题

c++ - 指针有拷贝构造函数吗?

.net - 将 System.Array 从 .Net 编码到 vb6

c# - 使用或不使用程序集重定向都找不到 F# Core 方法。我还可以做些什么?

c# - 基于 Wix 安装程序的 TopShelf Windows 服务无法启动

java - 处理与 JNI 的关联

java - JAXB 可映射 XML 元素