我在作業中遇到了非常像下面這樣的事情。我以前從未使用過如此大量使用結構的 C# 代碼庫。
我之前使用過fixed來防止垃圾收集器在我使用指標處理不安全的事情時移動東西。但是我從未見過它在獲取指標并將其傳遞給這樣的 Span 然后在固定陳述句之外使用 Span 時使用它。
這個可以嗎?我想既然 Span 是管理的,一旦我們將位置傳遞給它,那么如果 GC 移動了 MyStruct 的位置,它應該可以獲取新的位置,對嗎?
[StructLayout(LayoutKind.Sequential)]
public unsafe struct MyInnerStruct
{
public uint InnerValueA;
public uint InnerValueB;
public float InnerValueC;
public long InnerValueD;
}
[StructLayout(LayoutKind.Sequential)]
public unsafe struct MyStruct
{
public MyInnerStruct Value0;
public MyInnerStruct Value1;
public MyInnerStruct Value2;
public MyInnerStruct Value3;
public MyInnerStruct Value4;
public MyInnerStruct Value5;
public MyInnerStruct Value6;
public MyInnerStruct Value7;
public MyInnerStruct Value8;
public MyInnerStruct Value9;
public int ValidValueCount;
public Span<MyInnerStruct> Values
{
get
{
fixed (MyInnerStruct* ptr = &Value0)
{
return new Span<MyInnerStruct>(ptr, ValidValueCount);
}
}
}
}
uj5u.com熱心網友回復:
這是 .NET 6 中的源代碼
public unsafe Span(void* pointer, int length)
{
_pointer = new ByReference<T>(ref Unsafe.As<byte, T>(ref *(byte*)pointer));
_length = length;
}
您的代碼:
fixed (MyInnerStruct* ptr = &Value0)
{
return new Span<MyInnerStruct>(ptr, ValidValueCount);
}
我做了一些測驗,即使 PTR 被垃圾收集器移動,像你一樣使用跨度總是安全的。
我還測驗了Span在移動 ptr 并且原始物件仍然正確更新后寫入。
Span 將始終回傳正確的值,因為 ByReference
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/388595.html
下一篇:如何等待未知呼叫者呼叫函式?
