Que fait vraiment un casting C?

J’écris de plus en plus d’applications C, et maintenant je m’interroge sur les moulages. En C ++, une conversion dynamic est une opération très coûteuse (par exemple, une conversion), mais je ne sais même pas pour une dissortingbution statique.

En C, je devais écrire quelque chose comme ça:

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

Est-ce un «casting dynamic en C»? Est-ce tout à fait pareil que le static_cast(p) de C ++? Combien ça coûte?

Merci d’avance.

Une conversion en C n’a de sens que lors de la compilation car elle indique au compilateur comment vous voulez manipuler une donnée. Cela ne change pas la valeur réelle des données. Par exemple, (int*)p indique au compilateur de traiter p comme une adresse mémoire à un entier. Toutefois, cela ne coûte rien au moment de l’exécution, le processeur ne traite que les chiffres bruts comme ils lui ont été atsortingbués.

La transtypage AC d’un pointeur s’apparente davantage à une reinterpret_cast C ++. Il demande au compilateur de traiter une variable comme étant d’un type différent et ne coûte rien au moment de l’exécution.

La conversion AC ressemble davantage à toutes les transformations de style C ++, à l’ exception de dynamic_cast combiné. Ainsi, lorsque vous static_cast un int en un autre type entier, il s’agit de static_cast . Lorsque vous transposez des pointeurs sur d’autres types de pointeurs ou sur des types entiers ou inversement, il s’agit de reinterpret_cast . Si vous const_cast un const , c’est const_cast .

C n’a pas quelque chose de similaire à dynamic_cast puisqu’il a le concept de types d’objects et ne les utiliserait pas comme C ++ non plus (pas de fonctions virtuelles …). Les types d’interprétation des bits d’un object ne deviennent importants que lorsqu’ils sont combinés avec des expressions faisant référence à des objects, en C. Les objects eux-mêmes n’ont pas de types.

Les pointeurs sont des pointeurs – lancer un pointeur est un noop.

C’était une adresse mémoire avant, c’est une adresse mémoire après.

Il s’agit essentiellement d’une déclaration ” supposons qu’il s’agisse d’un pointeur sur lequel taper x pour la vérification de type future”.

Vous pouvez donc appeler cela une reinterpret_cast en termes de C ++, car elle n’effectue pas de vérification supplémentaire du type de temps de compilation comme par exemple dynamic_cast ou static_cast .

Je ne pense pas que C ait les équivalents d’un dynamic_cast (“insérer un type de contrôle d’exécution ici”) ou d’un static_cast (“effectuer des contrôles de type de temps de compilation supplémentaires ici”).

Notez que pour les non-pointeurs, les choses se comporteront légèrement différemment.

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

n’est pas vraiment une dissortingbution, mais une conversion de type explicite.