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[] には、配列の次元と要素の型を含むいくつかのメタデータがヒープに含まれています。T[] への参照 (ポインター) を byte[] として渡すだけでは、ブロックのメタデータが T[] のままであるため、機能しない場合があります。また、メタ データの構造が同一であっても、T[] の長さは byte[] よりもはるかに短くなるため、マネージ コードによるその後の byte[] へのアクセスは、正しくない結果を生成します。
機能要求 @ Microsoft Connectこの要求に 投票してください。MS が耳を傾けてくれることを願っています。