#7
by Math » 7年前
キャストは次のように決まります。
1.dynamic_cast, const_cast の場面ではそれを使う
2.使えるなら、 static_cast
3.どれにもあわなければ、 reinterpret_cast
static_cast は暗黙的な変換がある場合などコンパイラーにとって予測可能な変換の時に使うキャストです。
コンパイラーは変換方法はわかってますが、情報落ちが発生する変換や int から列挙型、 void * の変換などでは危険が伴うためにエラーや警告を出します。 その危険を承知した上で変換するとコンパイラーに伝えるのが static_cast です。
それに対して reinterpret_cast はコンパイラーとしては「そんなことはするなよ」といいたいようなキャストです。
reinterpret_cast にほとんど制限はなく、他の 3 つのキャストに当てはまらない時の奥の手ともいえるキャストです。
そういった reinterpret_cast を使わざるを得ない場面はというと、次のような場合が考えられます。
1.ポインタのアドレス値を整数型の変数に格納
2. double * から int * など違う型のポインタの変換
このような処理は効率を考えた場合に必要となってくる場合があります。
double の変数から int へのキャストであれば、コンパイラーは適切に処理して変換できます。 ただ、 double * から int * への変換といったポインターのキャストとなると、 double の構造を持つ変数を int として処理するわけですから、普通は不定の動作をしてしまいます。 これはコンパイラーにとっては「何でこんなことやっているの!?」というような処理だと思います。
しかし、このような変換もメモリとして扱う場合には使えます。
例えば、次のような場合でしょう。
•バイトスワップで double の値を unsiged long long にする
•バイナリファイルの読み取りで char 型の配列で用意したバッファーに構造体を格納する
ただ、これは一回 void * を経由すれば、 static_cast で書けることが多い。
そうすると純粋なメモリとして扱うための処理だよということをコンパイラーに知らせることになります。
[size=85]
キャストは次のように決まります。
1.dynamic_cast, const_cast の場面ではそれを使う
2.使えるなら、 static_cast
3.どれにもあわなければ、 reinterpret_cast
static_cast は暗黙的な変換がある場合などコンパイラーにとって予測可能な変換の時に使うキャストです。
コンパイラーは変換方法はわかってますが、情報落ちが発生する変換や int から列挙型、 void * の変換などでは危険が伴うためにエラーや警告を出します。 その危険を承知した上で変換するとコンパイラーに伝えるのが static_cast です。
それに対して reinterpret_cast はコンパイラーとしては「そんなことはするなよ」といいたいようなキャストです。
reinterpret_cast にほとんど制限はなく、他の 3 つのキャストに当てはまらない時の奥の手ともいえるキャストです。
そういった reinterpret_cast を使わざるを得ない場面はというと、次のような場合が考えられます。
1.ポインタのアドレス値を整数型の変数に格納
2. double * から int * など違う型のポインタの変換
このような処理は効率を考えた場合に必要となってくる場合があります。
double の変数から int へのキャストであれば、コンパイラーは適切に処理して変換できます。 ただ、 double * から int * への変換といったポインターのキャストとなると、 double の構造を持つ変数を int として処理するわけですから、普通は不定の動作をしてしまいます。 これはコンパイラーにとっては「何でこんなことやっているの!?」というような処理だと思います。
しかし、このような変換もメモリとして扱う場合には使えます。
例えば、次のような場合でしょう。
•バイトスワップで double の値を unsiged long long にする
•バイナリファイルの読み取りで char 型の配列で用意したバッファーに構造体を格納する
ただ、これは一回 void * を経由すれば、 static_cast で書けることが多い。
そうすると純粋なメモリとして扱うための処理だよということをコンパイラーに知らせることになります。
[/size]