在 C# 中,我需要将 T[] 写入流,理想情况下不需要任何额外的缓冲区。我有一个动态代码将 T[] (其中 T 是一个无对象结构)转换为 void* 并将其修复在内存中,效果很好。当流是文件时,我可以使用本机 Windows API 直接传递 void *,但现在我需要写入一个接受 byte[] 的通用 Stream 对象。
问题:任何人都可以建议一种黑客方法来创建一个实际上没有任何堆分配的虚拟数组对象,而是指向一个已经存在(和固定)的堆位置?
这是我需要的伪代码:
void Write(Stream stream, T[] buffer)
{
fixed( void* ptr = &buffer ) // done with dynamic code generation
{
int typeSize = sizeof(T); // done as well
byte[] dummy = (byte[]) ptr; // <-- how do I create this fake array?
stream.Write( dummy, 0, buffer.Length*typeSize );
}
}
更新:fixed(void* ptr=&buffer)
我在这篇文章中
详细描述了如何做。我总是可以创建一个字节 [],在内存中修复它并从一个指针到另一个指针进行不安全的字节复制,然后将该数组发送到流,但我希望避免不必要的额外分配和复制。
不可能的? 经过进一步思考,byte[] 在堆中有一些元数据,其中包含数组维度和元素类型。简单地将引用(指针)作为 byte[] 传递给 T[] 可能不起作用,因为块的元数据仍然是 T[] 的元数据。而且即使元数据的结构相同,T[] 的长度也会比 byte[] 小很多,因此托管代码对 byte[] 的任何后续访问都会产生错误的结果。
功能要求@Microsoft Connect 请投票支持此请求,希望 MS 会倾听。