簡體   English   中英

在 C# 中的等效結構之間高效轉換

[英]Efficiently convert between equivalent structs in C#

我在兩個使用等效結構的庫之間進行通信。 例如:

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

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

目前,我通過將每個成員復制到另一個成員的實例中來在這些類型之間“轉換”。 知道 C# 如何在 memory 中存儲結構,難道沒有更有效的方法來使用指針嗎?

另外,假設我有兩個 arrays 這些等效結構:

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

沒有辦法將memory的整個塊從array1復制到array2嗎? 或者更好的是,我可以將整個array1 視為array2 類型而不在memory 中創建副本嗎?

我確定答案需要指針,但我只在 C++ 中使用過指針,不知道 C# 是如何實現它們的。

有沒有人有任何關於如何實現這樣的目標的例子?

提前致謝!

是的,如果您絕對 100% 確定它們具有相同的 memory 布局,您可以在它們之間進行強制轉換。 這樣做的首選方法(以避免過多的unsafe /指針)是:spans。 例如:

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

這將theirs作為Span<TheirVector>提供,而無需復制任何實際數據。 跨度與數組/向量具有非常相似的 API,因此您希望工作的大多數事情:應該完全按照您的預期工作。 您只需使用不同的類型對相同的 memory 進行類型化引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM