public static unsafe int WriteAsPtr <T>(this MemoryStream stream, T value) { var size = TypeHelper <T> .Size; if (size <= 0) { throw new InvalidOperationException("This method should only be used for writing fixed-size types to a stream"); } // NB do not use a buffer pool here but instead use a thread-static buffer // that will grow to maximum size of a type. Fixed-size types are usually small. // Take/return is more expensive than the work we do with the pool here. using (var wrapper = RecyclableMemoryManager.GetBuffer(size)) { var threadStaticBuffer = wrapper.Buffer; fixed(byte *ptr = &threadStaticBuffer[0]) { var buffer = new DirectBuffer(threadStaticBuffer.Length, (IntPtr)ptr); TypeHelper <T> .Write(value, ref buffer); } stream.Write(threadStaticBuffer, 0, size); } // NB this is not needed as long as converter.Write guarantees overwriting all Size bytes. // //Array.Clear(_buffer, 0, size); return(size); }