Ich schreibe mehr und mehr C-Anwendungen, und jetzt frage ich mich etwas über Guss. In C ++ ist eine dynamische Besetzung eine sehr kostspielige Operation (zum Beispiel ein Downcast), aber ich weiß nicht einmal, ob es sich um eine statische handelt.
In C musste ich so etwas schreiben:
%Vor% Ist es ein «C-Dynamic-Cast»? Ist es das gleiche wie das static_cast<int*>(p)
von C ++? Wie viel kostet es?
Vielen Dank im Voraus.
Ein Cast in C ist nur zur Kompilierzeit sinnvoll, da er dem Compiler mitteilt, wie Sie ein Stück Daten bearbeiten wollen. Es ändert den tatsächlichen Wert der Daten nicht. Beispiel: (int*)p
weist den Compiler an, p
als Speicheradresse für eine ganze Zahl zu verwenden. Dies kostet jedoch zur Laufzeit nichts, der Prozessor behandelt die rohen Zahlen nur so, wie sie ihm gegeben werden.
Ein C-Cast ist mehr wie alle C ++ - Style-Casts außer dynamic_cast
kombiniert. Wenn Sie also ein int in einen anderen Integer-Typ umwandeln, ist es static_cast
. Wenn Sie Zeiger auf andere Zeigertypen oder ganzzahlige Typen oder umgekehrt umwandeln, ist dies reinterpret_cast
. Wenn Sie const
wegwerfen, ist es const_cast
.
C hat nicht so etwas wie dynamic_cast
, da es ein Konzept von Objekttypen hat und für sie auch kein C ++ verwenden würde (keine virtuellen Funktionen ...). Typen in Bezug auf die Interpretation der Bits eines Objekts werden nur dann wichtig, wenn sie mit Objekten, die sich auf Objekte beziehen, in C kombiniert werden. Die Objekte selbst haben keine Typen.
Zeiger sind Zeiger - das Umsetzen eines Zeigers ist ein Noop.
Es war vorher eine Speicheradresse, danach ist es eine Speicheradresse.
Es ist im Wesentlichen eine Anweisung "Lassen Sie annehmen , dass dies ein Zeiger auf Typ x für zukünftige Typüberprüfung ist".
Sie könnten dies also als reinterpret_cast
in Bezug auf C ++ bezeichnen, da es keine zusätzliche Kompilierzeit vornimmt, um z. dynamic_cast
oder% static_cast
.
Ich glaube nicht, dass C die Entsprechungen eines dynamic_cast
hat ("runtime type check here") oder ein static_cast
("führe zusätzliche Übersetzungszeitprüfungen hier aus").
Beachten Sie, dass sich die Nicht-Zeiger etwas anders verhalten.
%Vor%ist nicht so sehr eine Umwandlung, sondern eine explizite Konvertierung .