我正在两个使用等效结构的库之间进行通信。例如:
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/