私の理解では、C++ reinterpret_castとCポインターキャストは単なるコンパイル時の機能であり、パフォーマンスコストはまったくありません。
これは本当ですか?
最初から始めるのは良い仮定です。ただし、オプティマイザは、reinterpret_cast<>
またはCポインタキャストが存在する場合に想定できる内容が制限される場合があります。次に、キャスト自体に関連する命令がない場合でも、結果のコードは遅くなります。
たとえば、intをポインターにキャストした場合、オプティマイザーはそのポインターが何を指しているのかわからない可能性があります。その結果、おそらく、そのポインターを介した書き込みによって任意の変数が変更される可能性があると想定する必要があります。これは、変数をレジスタに格納するなどの非常に一般的な最適化に勝るものです。
そのとおり。私が追加するかもしれない、新しい幅で命令を実行するためのパフォーマンスの増減以外のコストは、まれなケースでのみ懸念されます。私が今まで聞いたすべてのプラットフォームでポインター間をキャストしても、コストはゼロであり、パフォーマンスの変化はまったくありません。
C++でのCスタイルのキャストは、最初にstatic_castを試行し、静的キャストを実行できない場合にのみreinterpret_castを実行します。 static_castは、多重継承の場合(または、インターフェイスを具象型にキャストする場合)にポインターの値を変更する場合があり、このオフセット計算には追加のマシン命令が含まれる場合があります。これはせいぜい1つのマシン命令になるので、本当に非常に小さいです。
ええそれはそうです。実行時コストのあるキャストタイプはdynamic_castです。
reinterpret_cast
には実行時のコストは発生しません。ただし、reinterpret_cast
の使用はすべて実装で定義されているため、注意が必要です。たとえば、char
配列をint
配列として再解釈すると、タイプが異なればアライメントルールも異なる可能性があるため、ターゲットアーキテクチャが割り込みをスローする可能性があります。
最初に正解してから、効率について心配してください。
あなたは正しいですが、考えてみてください。reinterpret_castは、デザインが悪いか、非常に低いレベルで何かをしていることを意味します。
代わりに動的キャストは、実行時にルックアップテーブルを調べる必要があるため、コストがかかります。