首页 > 解决方案 > 在 C# 中的等效结构之间有效转换

问题描述

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

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# 如何实现它们。

有没有人有任何关于如何实现这样的目标的例子?

提前致谢!

标签: c#pointersstructcastingcopy

解决方案


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

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

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


推荐阅读