Was macht ein C-Cast wirklich?

8

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.

    
phaazon 06.12.2012, 14:50
quelle

4 Antworten

7

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.

    
jazzbassrob 06.12.2012, 14:53
quelle
8

Ein C-cast eines Zeigers ähnelt eher einem C ++ reinterpret_cast . Es weist den Compiler an, eine Variable als einen anderen Typ zu behandeln und kostet zur Laufzeit nichts.

    
simonc 06.12.2012 14:52
quelle
5

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.

    
Johannes Schaub - litb 06.12.2012 14:59
quelle
2

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 .

    
Anony-Mousse 06.12.2012 14:54
quelle

Tags und Links