スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Prev.    Category    Next 

C++ のキャスト - reinterpret_cast

C++ のキャスト の最後は reinterpret_cast です。

void func(char *buf)
{
    int *foo = reinterpret_cast<int *>(buf);
前回の static_cast でも書きましたが、キャストは次のように決まります。
  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 * など違う型のポインタの変換

アドレス値を整数に格納

このような処理は効率を考えた場合に必要となってくる場合があります。

例えば Ruby の実装ではオブジェクトは VALUE という型で扱っています。
これはポインタと同じサイズの整数型です。 一般的な型ではここにアロケートしたオブジェクトのポインターを入れ、 整数の場合はメモリーが勿体無いので、直接入れます。
正確にはアドレス値と整数を区別するためにもう少し複雑なことをやっているらしいのですが、 大まかにはそんな感じです。

Ruby は C で実装されていますが、 C++ の場合は ポインターのアドレスを整数の型に入れるためには、 reinterpret_cast が必要になります。
こういったことは効率のためやっているのであって、コンパイラーとしてはおすすめできない処理だと思います。


また、 ポインターの型のサイズなどは、環境によって変わってきます。 reinterpret_cast を使うところは移植時に注意が必要な箇所とも言えます。

違う型へのポインターの変換

double の変数から int へのキャストであれば、コンパイラーは適切に処理して変換できます。 ただ、 double * から int * への変換といったポインターのキャストとなると、 double の構造を持つ変数を int として処理するわけですから、普通は不定の動作をしてしまいます。 これはコンパイラーにとっては「何でこんなことやっているの!?」というような処理だと思います。

しかし、このような変換もメモリとして扱う場合にはよく使います。
例えば、次のような場合でしょう。
  • バイトスワップで double の値を unsiged long long にする
  • バイナリファイルの読み取りで char 型の配列で用意したバッファーに構造体を格納する
ただ、これは一回 void * を経由すれば、 static_cast で書けることが多いです。
そうすると純粋なメモリとして扱うための処理だよということをコンパイラーに知らせることになります。

オブジェクト指向スクリプト言語 Ruby (ASCII SOFTWARE SCIENCE Language)オブジェクト指向スクリプト言語 Ruby (ASCII SOFTWARE SCIENCE Language)
(1999/10)
まつもと ゆきひろ、石塚 圭樹 他

商品詳細を見る

Ruby ソースコード完全解説Ruby ソースコード完全解説
(2002/12)
青木 峰郎

商品詳細を見る
関連記事
スポンサーサイト
Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
9位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
3位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

09月 | 2017年10月 | 11月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。