これを持っているだけの簡単な質問:
fftw_complex *H_cast;
H_cast = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);
違いは何ですか:
H_cast= reinterpret_cast<fftw_complex*> (H);
と
H_cast= reinterpret_cast<fftw_complex*> (&H);
どうもありがとうございました
アントニオ
これを持っているだけの簡単な質問:
fftw_complex *H_cast;
H_cast = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);
違いは何ですか:
H_cast= reinterpret_cast<fftw_complex*> (H);
と
H_cast= reinterpret_cast<fftw_complex*> (&H);
どうもありがとうございました
アントニオ
現在の質問への回答
違いは、2 つのまったく異なることを行うことです。
注: あなたは私たちに何が何であるかを教えてくれないH
ので、自信を持って質問に答えることは不可能です. しかし、一般原則が適用されます。
最初のケースが適切なコードであるためには、インスタンスへH
のポインター (void*
可能な限り型指定されていますか?) である必要がありfftw_complex
ます。H
これを行うと、が実際にはであることがコンパイラに伝えられるfftw_complex*
ため、それを使用できるようになります。
2 番目のケースが適切なコードでH
あるためには、 class と同じメモリ レイアウトを持つクラスのインスタンスである必要がありますfftw_complex
。このような状況に身を置く説得力のある理由は思いつきません。非常に不自然です。これに基づいて、および に関する情報を提供していないためH
、ほぼ間違いなくバグであると思います。
元の答え
主な違いは、2 番目のケースではソース コードを検索できることですreinterpret_cast
(そして、すべての使用が明確に文書化され、必要悪であることを確認してください)。
ただし、から別のポインター型にキャストvoid*
する場合 (これはここに当てはまりますか?)、static_cast
代わりに使用することをお勧めします (これも簡単に検索できます)。
H_cast= reinterpret_cast<fftw_complex*> (H);
これは、H 内のポインターっぽい型 (または、H が整数型の場合は整数自体) を変換し、コンパイラーに「これはポインターです。それが何であれ、今はポインターだと考えるのをやめてください」と伝えます。H は、ポインターのようなアドレスを格納した場所として使用されます。
H_cast= reinterpret_cast<fftw_complex*> (&H);
これは、H のアドレス (H の型へのポインター) を "fftw_complex" へのポインターに変換します。H_cast の内容を変更すると、H 自体が変更されるようになりました。
H がポインターでない場合は 2 番目、ポインターの場合は通常 1 番目が必要です。逆の使用例もありますが、それらは珍しく醜いものです (特に int または - 神が禁じている - double をポインターとして再解釈する場合)。
ポインター キャストは常に reinterpret_cast として実行されるため、void * からキャストする場合、または void にキャストする場合、c スタイルのキャスト、static_cast、または reinterpret_cast の間に違いはありません。
Reinterpret_casts は通常、c スタイルのキャストと static_casts が無害なキャストに使用される最も醜い場所のために予約されています。基本的に reinterpret_cast を使用して、一部のコードを本当に醜いものとしてタグ付けします。
float f = 3.1415f;
int x = *reinterpret_cast<int *>(&f);
そうすれば、これらの醜い安全でないキャストは検索可能/grepp可能です。