1. ホーム
  2. c++

[解決済み] reinterpret_castはいつ使うのか?

2022-03-17 20:18:26

質問

の適用について少し混乱しています。 reinterpret_caststatic_cast . 私が読んだ限りでは、コンパイル時に型が解釈できる場合は静的キャストを使用するのが一般的なルールで、そのため static . これは、C++コンパイラが暗黙のキャストに内部で使用しているキャストです。

reinterpret_cast は、2つのシナリオで適用されます。

  • 整数型からポインタ型への変換、またはその逆を行います。
  • あるポインタ型から別のポインタ型に変換する。私が得た一般的な考えは、これは移植性がなく、避けるべきということです。

CからC++を呼び出す場合、CのコードはC++オブジェクトを保持する必要があります。 void* . をどのようなキャストで変換すればよいのでしょうか? void * とClass型はどう違うのでしょうか?

の両方の使用法を見たことがあります。 static_castreinterpret_cast ? しかし、私が読んだ限りでは、それは static の方が、コンパイル時にキャストを行うことができるため、良いのでは?を使うように書かれていますが reinterpret_cast というのは、あるポインタ型から別のポインタ型に変換するためですか?

どのように解決するのですか?

C++の規格では、以下のことが保証されています。

static_cast へのポインタと void* はアドレスを保持する。つまり、以下のように a , bc はすべて同じアドレスを指しています。

int* a = new int();
void* b = static_cast<void*>(a);
int* c = static_cast<int*>(b);

reinterpret_cast は、ポインタを別の型にキャストした場合のみ保証されます。 で、次に reinterpret_cast 元の型に戻す であれば、元の値を得ることができます。つまり、以下のように。

int* a = new int();
void* b = reinterpret_cast<void*>(a);
int* c = reinterpret_cast<int*>(b);

ac は同じ値を含んでいますが b は不定です。(と同じアドレスが含まれます。 ac が、これは標準では規定されておらず、より複雑なメモリシステムを持つマシンでは正しくないかもしれません)。

とのキャストの場合 void* , static_cast が優先されます。