NativeBuffering这种零分配数据类型,如何实现优化?

摘要:上文说到Unmanaged、BufferedBinary和BufferedString是NativeBuffering支持的三个基本数据类型,其实我们也可以说NativeBuffering只支持Unmanaged和IReadOnlyBuff
上文说到Unmanaged、BufferedBinary和BufferedString是NativeBuffering支持的三个基本数据类型,其实我们也可以说NativeBuffering只支持Unmanaged和IReadOnlyBufferedObject<T>两种类型,BufferedString、NativeBuffering和通过Source Generator生成的BufferedMessage类型,以及下面介绍的几种集合和字典类型,都实现了IReadOnlyBufferedObject<T>接口。 一、IReadOnlyBufferedObject<T> 二、集合 三、字典 四、为什么不直接返回接口? 一、IReadOnlyBufferedObject<T>顾名思义,IReadOnlyBufferedObject<T>表示一个针对缓冲字节序列创建的只读数据类型。如下面的代码片段所示,该接口只定义了一个名为Parse的静态方法,意味着对于任何一个实现了该接口的类型,对应的实例都可以利用一个代表缓冲字节序列的NativeBuffer的对象进行创建。 public interface IReadOnlyBufferedObject<T> where T: IReadOnlyBufferedObject<T> { static abstract T Parse(NativeBuffer buffer); } public unsafe readonly struct NativeBuffer { public byte[] Bytes { get; } public void* Start { get; } public NativeBuffer(byte[] bytes, void* start) { Bytes = bytes ?? throw new ArgumentNullException(nameof(bytes)); Start = start; } public NativeBuffer(byte[] bytes, int index = 0) { Bytes = bytes ?? throw new ArgumentNullException(nameof(bytes)); Start = Unsafe.AsPointer(ref bytes[index]); } }由于IReadOnlyBufferedObject<T>是NativeBuffering支持的基础类型,而生成的BufferedMessage类型也实现了这个接口。通过这种“无限嵌套”的形式,我们可以定义一个具有任意结构的数据类型。比如我们具有如下这个表示联系人的Contact类型,我们需要利用它作为“源类型”生成对应BufferedMessage类型。
阅读全文