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类型。
