我正在两个使用等效结构的库之间进行通信。例如:
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>
,而不复制任何实际数据。跨度具有与数组/向量非常相似的API,因此您期望工作的大多数事情应该完全按照您的期望工作。你只是有一个对相同内存的类型引用,使用不同的类型。