unsafe

unsafe (C# によるプログラミング入門)
http://ufcpp.net/study/csharp/sp_unsafe.html
概要、ポインタ、unsafeコード、unsafeコード限定機能、固定長バッファ、余談C++/CLI


バグの原因になりやすく禁止されているポインタが、unsafeコードでは使えるようになる。
使うには、コンパイル時に/unsafeオプションが必要。
C言語との相互運用のためにある。パフォーマンス向上などのために使うのは最終手段。
C#では、ポインタを極力使わなくても済むように代替手段が提供されている。

ポインターを必要とする場面 代替機能
動的確保 参照型の変数は常に動的に確保される。
動的配列 C# の配列は元々動的。
引数の参照渡し 参照変数を使うもしくは ref、out キーワードを使う。
配列に対する反復処理の効率化 foreach 文を使う。


ポインタとは
ポインタ / メモリ (コンピュータの基礎知識)
http://ufcpp.net/study/computer/memory.html
「ポインタ」は、他の変数の「アドレス」を参照する。


unsafeコード

unsafe void UnsafeMethod()
{
  // unsafe メソッド。
  // ポインターが使用可能。
}

  unsafe
  {
    // unsafe ブロック。
    // ブロック内でのみポインター使用可能。
  }

ポインタの文法
& 演算子でアドレスの取り出し

*演算子ポインターの指している先を参照

  1. , --, ++, -- などの演算子でアドレスの値を計算


ポインタの使用以外に、
配列の静的確保(stackalloc)、
アドレス固定(fixed)、
unsafeな構造体のメンバとしての固定長バッファ(C#2.0)
が可能となる。


静的確保により少し効率が上がる。

型名* 変数名 = stackalloc 型名[配列長]; 


.NET Framework向けのコードは、メモリ管理が.NET Frameworkにより行われるので、managedコードと言われる。
しかし、ポインタを使う場合は、.NET Frameworkが勝手に管理しないように、アドレスを固定させる必要がある。

fixed(型名* 変数名 = アドレス取得式) 実行したい文


固定長バッファはC言語風のもの

unsafe struct Header
{
  public Int16 Source;
  public Int16 Destination;
  public Byte  Type;
  fixed byte reserved[3];
  public Int32 Data;
}