10

私は C アプリケーションを書くことがますます増えており、今ではキャストについて疑問に思っています。C++ では、動的キャストは非常にコストのかかる操作 (ダウン キャストなど) ですが、静的キャストについてはわかりません。

Cでは、次のようなものを書かなければなりませんでした:

assert ( p ); /* p is void* */
int v = *(int*)p;

« C の動的キャスト » ですか?static_cast<int*>(p)C++の とまったく同じですか?それはどれくらいしますか?

前もって感謝します。

4

4 に答える 4

8

C でのキャストは、データの一部を操作する方法をコンパイラに伝えるため、コンパイル時にのみ意味があります。データの実際の値は変更されません。たとえば、メモリ アドレスを整数として(int*)p扱うようにコンパイラに指示します。pただし、これには実行時のコストはかかりません。プロセッサは、与えられた方法で生の数値を処理するだけです。

于 2012-12-06T14:53:46.010 に答える
7

ポインターの AC キャストは C++ に似ていますreinterpret_cast。変数を別の型として扱うようにコンパイラに指示し、実行時のコストはかかりません。

于 2012-12-06T14:52:02.733 に答える
6

AC キャストは、組み合わせを除くすべての C++ スタイルのキャストに似ています。 dynamic_castしたがって、int を別の整数型にキャストすると、static_cast. ポインターを他のポインター型または整数型に、またはその逆にキャストすると、reinterpret_cast. a を捨てればconst、それはconst_castです。

Cdynamic_castにはオブジェクトのタイプの概念があり、C++のようにそれらを使用しないため、似たようなものはありません(仮想関数はありません...)。オブジェクトのビットの解釈に関する型は、C でオブジェクトを参照する式と組み合わせた場合にのみ重要になります。オブジェクト自体には型がありません。

于 2012-12-06T14:59:59.897 に答える
2

ポインターはポインターです-ポインターのキャストは面倒です。

以前はメモリアドレスでしたが、その後はメモリアドレスです。

これは本質的に、「将来の型チェックのために、これが型 x へのポインターであると仮定しましょう」というステートメントです。

したがって、egまたは aが行う余分なコンパイル時の型チェックをreinterpret_cast実行しないため、C++ に関してこれを a と呼ぶことができます。dynamic_caststatic_cast

dynamic_castC には、 (「実行時の型チェックをここに挿入する」) またはstatic_cast(「ここで追加のコンパイル時の型チェックを実行する」)に相当するものはないと思います。

非ポインターの場合、動作が少し異なることに注意してください。

int b = 1;
double a = (double) b;

キャストではなく、明示的な型変換です。

于 2012-12-06T14:54:30.177 に答える