12

C# .Net (3.5 以降) で、プロセスでガベージを作成せずに変数を byte[] バッファーにコピーすることは可能ですか?

例えば:

int variableToCopy = 9861;

byte[] buffer = new byte[1024];
byte[] bytes = BitConverter.GetBytes(variableToCopy);
Buffer.BlockCopy(bytes, 0, buffer, 0, 4);

float anotherVariableToCopy = 6743897.6377f;
bytes = BitConverter.GetBytes(anotherVariableToCopy);
Buffer.BlockCopy(bytes, 0, buffer, 4, sizeof(float));

...

byte[] バイトの中間オブジェクトを作成しますが、これはガベージになります (ref が保持されなくなったと仮定します)...

ビット単位の演算子を使用すると、中間バイト[]を作成せずに変数を直接バッファにコピーできるのでしょうか?

4

2 に答える 2

7

ポインターを使用するのが最善かつ最速の方法です。任意の数の変数でこれを行うことができ、無駄なメモリはありません。固定ステートメントには少しオーバーヘッドがありますが、小さすぎます

        int v1 = 123;
        float v2 = 253F;
        byte[] buffer = new byte[1024];
        fixed (byte* pbuffer = buffer)
        {
            //v1 is stored on the first 4 bytes of the buffer:
            byte* scan = pbuffer;
            *(int*)(scan) = v1;
            scan += 4; //4 bytes per int

            //v2 is stored on the second 4 bytes of the buffer:
            *(float*)(scan) = v2;
            scan += 4; //4 bytes per float
        }
于 2013-03-09T05:33:34.167 に答える
3

なぜあなたはただできないのですか:

byte[] buffer = BitConverter.GetBytes(variableToCopy);

ここでの配列は、元のInt32のストレージへの間接参照ではなく、非常にコピーであることに注意してください。

bytesあなたはおそらくあなたの例では以下と同等であると心配しているでしょう:

unsafe
{
    byte* bytes = (byte*) &variableToCopy;
}

..しかし、そうではないことを保証します。これは、ソースInt32のバイトのバイトごとのコピーです。

編集

あなたの編集に基づいて、私はあなたがこのようなものが欲しいと思います(安全でないコンテキストが必要です):

public unsafe static void CopyBytes(int value, byte[] destination, int offset)
{
    if (destination == null)
        throw new ArgumentNullException("destination");

    if (offset < 0 || (offset + sizeof(int) > destination.Length))
        throw new ArgumentOutOfRangeException("offset");

    fixed (byte* ptrToStart = destination)
    {
        *(int*)(ptrToStart + offset) = value;
    }
}
于 2013-03-09T05:18:25.007 に答える