C# 版の memcpy, memset

C# に C の memcpy にあたるような関数は、Buffer.BlockCopy や Marshal.Copy がありますが、、、、どうも引数が???で使いにくい。

ということで、使いにくい関数を使うよりは作ってしまえということで、C# の unsafe を使って書いてしまうと以下のようになります。

unsafe void memcpy(byte* src, byte* dst, int bytesize)
{
  byte* sentinel = src + bytesize;
  while (src < sentinel)
  {
    dst[0] = src[0];
    src++;
    dst++;
  }
}

ついでに memset は以下のようになります。

unsafe void memset(byte* tgt, byte val, int bytesize)
{
  byte* sentinel = tgt + bytesize;
  while (tgt < sentinel)
  {
    tgt[0] = val;
    tgt++;
  }
}

注意点として、上の関数を使ってコピー、値のセットを行うメモリ領域には、キーワード fixed をつけるなどして、ガベージコレクションによって勝手に領域が移動しないようにすることがあります。