static_cast<>の違いは何ですか?およびCスタイルのキャスト?
-
05-07-2019 - |
質問
Cスタイルのキャストよりも static_cast<>
を好む理由はありますか?それらは同等ですか?速度の違いはありますか?
解決
C ++スタイルのキャストは、コンパイラによってチェックされます。 Cスタイルのキャストは実行されず、実行時に失敗する可能性があります
また、C ++スタイルのキャストは簡単に検索できますが、Cスタイルのキャストを検索するのは非常に困難です
もう1つの大きな利点は、4つの異なるC ++スタイルのキャストがプログラマの意図をより明確に表現できることです。
C ++を作成するときは、CスタイルではなくC ++を使用することがほとんどです。
他のヒント
簡単に:
-
static_cast<>()
は、コンパイル時のチェック機能、Cスタイルを提供します キャストはしません。 -
static_cast<>()
は読みやすく、簡単に見つけることができます C ++ソースコード内のどこにでも、C_Styleキャストはありません。 - C ++キャストを使用すると、意図がはるかにわかりやすく伝わります。
詳細説明:
静的キャストは、互換タイプ間の変換を実行します。 Cスタイルのキャストに似ていますが、より制限的です。たとえば、Cスタイルのキャストでは、整数ポインターがcharを指すことができます。
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
これにより、割り当てられたメモリの1バイトを指す4バイトポインター(4バイトデータ型へのポインター)が生成されるため、このポインターに書き込むと、ランタイムエラーが発生するか、隣接するメモリが上書きされます。
*p = 5; // run-time error: stack corruption
Cスタイルのキャストとは対照的に、静的キャストにより、コンパイラーはポインターとポインターのデータ型に互換性があることを確認できます。これにより、プログラマーはコンパイル中にこの誤ったポインターの割り当てをキャッチできます。
int *q = static_cast<int*>(&c); // compile-time error
C ++キャストの詳細については、このページも確認できます。ここをクリック
C ++キャスト演算子の比較を参照してください。
ただし、さまざまなキャスト操作に同じ構文を使用すると、プログラマの意図が不明確になる可能性があります。
さらに、大規模なコードベースで特定のタイプのキャストを見つけることは困難です。
Cスタイルのキャストの一般性は、単純な変換だけが必要な状況ではやり過ぎになる可能性があります。程度の異なるさまざまなキャスト演算子を選択できるため、プログラマーが誤って誤った型にキャストするのを防ぐことができます。
struct A {};
struct B : A {};
struct C {};
int main()
{
A* a = new A;
int i = 10;
a = (A*) (&i); // NO ERROR! FAIL!
//a = static_cast<A*>(&i); ERROR! SMART!
A* b = new B;
B* b2 = static_cast<B*>(b); // NO ERROR! SMART!
C* c = (C*)(b); // NO ERROR! FAIL!
//C* c = static_cast<C*>(b); ERROR! SMART!
}
static_cast
は、コンパイル時に明らかに互換性のない型間の変換ではないことを確認します。 dynamic_cast
とは異なり、実行時に型の互換性のチェックは行われません。また、 static_cast
の変換は必ずしも安全ではありません。
static_cast
は、基本クラスへのポインターから派生クラスへのポインターへの変換、またはenumからintまたはfloatからintなどのネイティブ型間の変換に使用されます。
static_cast
のユーザーは、変換が安全であることを確認する必要があります。
Cスタイルのキャストは、コンパイル時または実行時にチェックを実行しません。
それぞれが異なるセマンティクスを持つ多くの異なる種類のキャストがあるため、static_cast&lt;&gt; 「あるタイプから別のタイプに合法的に変換しています」と言うことができます。 intからdoubleへ。単純なCスタイルのキャストは、多くのことを意味します。アップ/ダウンキャストですか?ポインターを再解釈していますか?
C / C ++のさまざまなキャストと、Cスタイルのキャストが実際に行うことを説明する素晴らしい投稿: https://anteru.net/blog/2007/12/18/200/index.html
(タイプ)変数構文を使用したCスタイルのキャスト。史上最悪 発明しました。これは、次のキャストをこの順序で実行しようとします(参照 C ++標準、5.4 expr.castパラグラフ5)
- const_cast
- static_cast
- static_castに続いてconst_cast
- reinterpret_cast
- reinterpret_castの後にconst_castが続く