c# - 在 C# 中的等效结构之间高效转换

标签 c# pointers struct casting copy

我正在两个使用等效结构的库之间进行通信。例如:

struct MyVector {
    public float x, y, z;
}

struct TheirVector {
    public float x, y, z;
}

目前,我通过将每个成员复制到另一个成员的实例中来在这些类型之间进行“转换”。知道 C# 如何在内存中存储结构,是否有更有效的方法来使用指针来实现此目的?

此外,假设我有两个等效结构的数组:

MyVector[] array1; // (Length 1000)
TheirVector[] array2; // (Length 1000)

有没有办法将整个内存块从 array1 复制到 array2 中?或者甚至更好,我可以将整个 array1 视为 array2 类型,而不在内存中创建副本吗?

我确信答案需要指针,但我只在 C++ 中使用过指针,不知道 C# 是如何实现它们的。

有人有关于如何实现这样的事情的示例吗?

提前致谢!

最佳答案

是的,如果您绝对 100% 确定它们具有相同的内存布局,您可以在它们之间进行强制。执行此操作的首选方法(以避免太多 unsafe/指针)是:span。例如:

var theirs = MemoryMarshal.Cast<MyVector, TheirVector>(array1);

这给出了 theirs作为Span<TheirVector>复制任何实际数据。 Spans 具有与数组/向量非常相似的 API,因此您期望工作的大多数内容:应该完全按照您的期望工作。您只需使用不同的类型对同一内存进行类型化引用即可。

关于c# - 在 C# 中的等效结构之间高效转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66455651/

相关文章:

arrays - Swift 分配指针数组

c# - 使用部分类而不是 Facade 模式本身是一种反模式吗?

c# - 自定义控件与 PropertyGrid 不兼容

r - 在 C++ 函数中,如何将 Rcpp 对象传递给其他函数(通过引用或复制)?

C 编程 : Reading from a file and printing on screen - formatting

c++ - 在结构的 union 成员中使用 std::string 时无法引用默认构造函数

c - 在c中将结构体添加到链表中

c# - Autofac拦截目标方法

c# - 出现 ASP 错误 : Mailbox unavailable. 服务器响应为 : Access denied - Invalid HELO name (See RFC2821 4. 1.1.1)

c - 用指针确定输出