web-dev-qa-db-ja.com

reinterpret_castキャストコスト

私の理解では、C++ reinterpret_castとCポインターキャストは単なるコンパイル時の機能であり、パフォーマンスコストはまったくありません。

これは本当ですか?

42
fulmicoton

最初から始めるのは良い仮定です。ただし、オプティマイザは、reinterpret_cast<>またはCポインタキャストが存在する場合に想定できる内容が制限される場合があります。次に、キャスト自体に関連する命令がない場合でも、結果のコードは遅くなります。

たとえば、intをポインターにキャストした場合、オプティマイザーはそのポインターが何を指しているのかわからない可能性があります。その結果、おそらく、そのポインターを介した書き込みによって任意の変数が変更される可能性があると想定する必要があります。これは、変数をレジスタに格納するなどの非常に一般的な最適化に勝るものです。

57
MSalters

そのとおり。私が追加するかもしれない、新しい幅で命令を実行するためのパフォーマンスの増減以外のコストは、まれなケースでのみ懸念されます。私が今まで聞いたすべてのプラットフォームでポインター間をキャストしても、コストはゼロであり、パフォーマンスの変化はまったくありません。

6
Matt Joiner

C++でのCスタイルのキャストは、最初にstatic_castを試行し、静的キャストを実行できない場合にのみreinterpret_castを実行します。 static_castは、多重継承の場合(または、インターフェイスを具象型にキャストする場合)にポインターの値を変更する場合があり、このオフセット計算には追加のマシン命令が含まれる場合があります。これはせいぜい1つのマシン命令になるので、本当に非常に小さいです。

5
doron

ええそれはそうです。実行時コストのあるキャストタイプはdynamic_castです。

2
Alex F

reinterpret_castには実行時のコストは発生しません。ただし、reinterpret_castの使用はすべて実装で定義されているため、注意が必要です。たとえば、char配列をint配列として再解釈すると、タイプが異なればアライメントルールも異なる可能性があるため、ターゲットアーキテクチャが割り込みをスローする可能性があります。

最初に正解してから、効率について心配してください。

1
Billy ONeal

あなたは正しいですが、考えてみてください。reinterpret_castは、デザインが悪いか、非常に低いレベルで何かをしていることを意味します。

代わりに動的キャストは、実行時にルックアップテーブルを調べる必要があるため、コストがかかります。

1
vulkanino