web-dev-qa-db-fra.com

Quelle est la différence entre le casting statique> et le style C?

Y a-t-il une raison de préférer static_cast<> sur le casting de style C? Sont-ils équivalents? Y a-t-il une différence de vitesse?

182
dicroce

Les conversions de style C++ sont vérifiées par le compilateur. Les conversions de style C ne sont pas et peuvent échouer à l'exécution

de plus, il est facile de rechercher des conversions de style c ++, alors qu'il est très difficile de rechercher des transformations de style c

Un autre grand avantage est que les 4 styles différents de C++ expriment plus clairement l'intention du programmeur.

Lors de l'écriture en C++, j'utilisais presque toujours les versions C++ par rapport au style C.

199
Glen

En bref :

  1. static_cast<>() vous donne une capacité de vérification du temps de compilation, contrairement à la distribution C-Style.
  2. static_cast<>() est plus lisible et peut être facilement repéré n'importe où dans un code source C++, la distribution C_Style n'est pas.
  3. Les intentions sont bien mieux transmises avec les conversions en C++.

Plus d'explications :

La distribution statique effectue des conversions entre types compatibles . Il ressemble au casting C-style, mais est plus restrictif. Par exemple, la conversion de style C permettrait à un pointeur entier de pointer vers un caractère.

char c = 10;       // 1 byte
int *p = (int*)&c; // 4 bytes

Dans la mesure où il en résulte un pointeur de 4 octets (un pointeur sur un type de données à 4 octets) pointant vers un octet de mémoire allouée, l'écriture sur ce pointeur provoquera une erreur d'exécution ou remplacera une partie de la mémoire adjacente.

*p = 5; // run-time error: stack corruption

Contrairement à la conversion de style C, la conversion statique permettra au compilateur de vérifier la compatibilité des types de données pointeur et pointee, ce qui permettra au programmeur de détecter cette affectation incorrecte du pointeur lors de la compilation.

int *q = static_cast<int*>(&c); // compile-time error

Vous pouvez également consulter cette page pour plus d'explications sur les conversions C++: Cliquez ici

163
Breeze

Voir Comparaison des opérateurs de transtypage C++ .

Cependant, l'utilisation de la même syntaxe pour une variété d'opérations de transtypage peut rendre l'intention du programmeur peu claire.

De plus, il peut être difficile de trouver un type spécifique de transtypage dans une base de code volumineuse.

la généralité de la distribution de style C peut être exagérée dans des situations où une simple conversion suffit. La possibilité de choisir entre plusieurs opérateurs de casting de niveaux de puissance différents peut empêcher les programmeurs de lancer par inadvertance un casting incorrect.

15
Eugene Yokota
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!
}
15
Rishi Khaneja

static_cast vérifie au moment de la compilation que la conversion ne se fait pas entre des types manifestement incompatibles. Contrairement à dynamic_cast, aucune vérification de la compatibilité des types n’est effectuée au moment de l’exécution. Aussi, static_cast _ la conversion n’est pas forcément sûre.

static_cast est utilisé pour convertir un pointeur en classe de base en pointeur en classe dérivée ou entre types natifs, tels que enum to int ou float to int.

L'utilisateur de static_cast doit s'assurer que la conversion est sécurisée.

La distribution de style C n'effectue aucune vérification, ni lors de la compilation, ni lors de l'exécution.

5
kiriloff

Un excellent article expliquant les différentes versions de C/C++ et ce que font réellement les distributions de style C: https://anteru.net/blog/2007/12/18/200/index.html

C-Style casting, en utilisant la syntaxe de variable (type). Le pire jamais inventé. Ceci tente de faire les conversions suivantes, dans cet ordre: (voir aussi C++ Standard, 5.4 expr.cast paragraphe 5)

  1. const_cast
  2. static_cast
  3. static_cast suivi de const_cast
  4. réinterpréter_cast
  5. réinterpréter_castsuivre par const_cast
5
Ying Xiong

Comme il existe de nombreux types de transtypages ayant chacun une sémantique différente, static_cast <> vous permet de dire "Je fais une conversion légale d'un type à un autre", comme de l'int en double. Un casting de style C simple peut signifier beaucoup de choses. Êtes-vous casting haut/bas? Êtes-vous en train de réinterpréter un pointeur?

4
Doug T.