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?
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.
En bref :
static_cast<>()
vous donne une capacité de vérification du temps de compilation, contrairement à la distribution C-Style.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.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
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.
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!
}
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.
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)
- const_cast
- static_cast
- static_cast suivi de const_cast
- réinterpréter_cast
- réinterpréter_castsuivre par const_cast
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?