C# 固定包含不可blic类型的结构数组#

C# 固定包含不可blic类型的结构数组#,c#,memory-management,struct,C#,Memory Management,Struct,我有一个场景,其中有结构数组,我在一个对象中构建它们的批处理(即StructA、StructB、StructD),并带有指向它们内存的指针(因为创建批处理后可以更新结构数据),我不想跟踪并重建批处理,理想情况下,我希望包含所有用于快速查找的指针 例如,以下是其中一个批次的外观: [StructLayout(LayoutKind.Sequential)] public unsafe struct Batch<T1, T2> : IEquatable<Batch<T1, T2

我有一个场景,其中有结构数组,我在一个对象中构建它们的批处理(即StructA、StructB、StructD),并带有指向它们内存的指针(因为创建批处理后可以更新结构数据),我不想跟踪并重建批处理,理想情况下,我希望包含所有用于快速查找的指针

例如,以下是其中一个批次的外观:

[StructLayout(LayoutKind.Sequential)]
public unsafe struct Batch<T1, T2> : IEquatable<Batch<T1, T2>> 
    where T1 : unmanaged, IComponent
    where T2 : unmanaged, IComponent
{
    public readonly int EntityId;
    public readonly T1* Component1;
    public readonly T2* Component2;

    public Batch(int entityId, T1* component1, T2* component2)
    {
        EntityId = entityId;
        Component1 = component1;
        Component2 = component2;
    }
}
[StructLayout(LayoutKind.Sequential)]
公共不安全结构批处理:IEquatable
其中T1:非托管,IComponent
其中T2:非托管,IComponent
{
公共只读int EntityId;
公共只读T1*组件1;
公共只读T2*组件2;
公共批处理(int entityId、T1*组件1、T2*组件2)
{
EntityId=EntityId;
组件1=组件1;
组件2=组件2;
}
}
现在,我最初只是使用
fixed
关键字,并在数组上循环获取我想要的结构并获取它们的地址,但是我很快意识到,修复只在方法的范围内起作用,因此GC仍将移动内存,这意味着指针将在一段时间后引用垃圾

然后我研究了固定内存,但是当我这样做时,如果结构包含bool(我认为
chars
,基本上是任何不可Blitttable的结构),它就会爆炸。在这个场景中,所有的结构都应该包含值类型的数据,但是我不希望为了避免这种情况而必须强制使用blittable数据类型

既然
fixed
只是临时性的,而钉扎只允许可跳转的数据,那么有没有另一种方法可以让我获得指向结构的指针/引用

执行此批处理的主要动机是性能,因为它在理想情况下会保持内存访问顺序,并有希望在CPU上允许更多的预取和缓存,所以这就是为什么我们保留指针而不仅仅是有一个用于查找的索引(因为这可能会破坏任何预取和缓存查找)

==编辑==

为了清楚起见,讨论中的框架是一个.net标准类库,它目前是根据.net标准2.1构建的


它也是针对c#7.3的,我不能完全确定我是否可以安全地转到c#8.0,因为消费者可能在.net framework或mono上运行,因此如果他们被卡在7.3上,那么可能需要在我升级之前确认这一点。

.net framework。net核心?适用于任何一个平台,所讨论的框架是.net标准,因此可以在任何一个平台上运行。哪个版本的.net标准?根据您的具体目标,您可以使用的工具会发生变化?将使用详细信息更新..net framework。net核心?适用于任何一个平台,所讨论的框架是.net标准,因此可以在任何一个平台上运行。哪个版本的.net标准?根据您的具体目标,您可以使用的工具会发生变化?将随详细信息更新。