2013-08-26 18 views
9

static_cast<T>(...)はコンパイル時または実行時に行われるものですか?私は周りを探索したが、私は別の答えを得た。static_cast <T>(...)はコンパイル時または実行時ですか?

また、dynamic_cast<T>(...)は明らかに実行時ですが、reinterpret_cast<T>(...)はどうですか?

+3

"静的" ...手がかりは名前にあります。 –

+0

static_castはランタイムチェックを実行しません。 – dare

+2

既存の答えから判断すると、ここで決定する必要があるより大きな問題は、「コンパイル時に完了する」*ということです。使用する変換はコンパイル時に選択されますが、実際の変換自体は、実行時に実行する必要がある変換コードをもたらす可能性があります(通常はそうです)。 –

答えて

8

他のものにキャストしているものによって異なります。例えば。 static_cast<std::string>("Hello")は、std::stringというコンストラクタを呼び出します。

reinterpret_castが実際のマシン命令を生成する必要がある場合は私の頭の上にはありません。コンパイラに伝えるだけです。このビットパターンをとり、このタイプの値であると考えてください。

+0

ああ、面白いです。これのルールは何ですか?これは 'int 'を' float'にキャストするときに起こりますか?そして、私が 'flo'を' int'にキャストしたときは? –

+0

コンパイル時の定数をキャストしていない限り(つまり、 'static_cast (42)'と書くと、コンパイラは通常、 '42f'で置き換えるほどスマートになります)コンパイル時に)。 –

+0

これは '-O3'で最適化されますか?また、パフォーマンスの高い数値キャストのために私がやっていることを確信しているときに 'reinterpret_cast'を使うべきですか? –

4

コンパイル時間。実際、コンパイラは、結果が正しいことをチェックするランタイムコードを挿入しません。コンパイラは、変換が静的に可能であることをチェックします。例:サブクラスからスーパークラスへのキャスト変換に組み込み関数またはキャスト関数を呼び出す必要がある場合は、実行時に実行されますが、型チェックは行われません。

+2

サブクラスからスーパークラスにキャストすると、実行時コードを生成する必要があります。前記スーパークラスが実際には仮想基本クラスであるとき@IgorTandetnik右。 –

+0

私はタイプチェックコードを意味しました。あいまいさを修正しようとしました(または普通のエラー!:-))。 –

関連する問題