¿Hay alguna razón para preferir static_cast<>
el casting de estilo C? ¿Son equivalentes? ¿Hay algún tipo de diferencia de velocidad?
c++
casting
static-cast
dicroce
fuente
fuente
Respuestas:
El compilador verifica los moldes de estilo C ++. Los modelos de estilo C no son y pueden fallar en tiempo de ejecución.
Además, los moldes de estilo c ++ se pueden buscar fácilmente, mientras que es realmente difícil buscar moldes de estilo c ++.
Otro gran beneficio es que los 4 modelos diferentes de estilo C ++ expresan la intención del programador más claramente.
Cuando escribo C ++, casi siempre uso los de C ++ sobre el estilo de C.
fuente
dynamic_cast
s.(int)something
no puede fallar, ya sea que reciba el int o el error del compilador.En resumen :
static_cast<>()
le da una capacidad de comprobación de tiempo de compilación, el elenco de C-Style no.static_cast<>()
es más legible y se puede detectar fácilmente en cualquier lugar dentro de un código fuente de C ++, C_Style cast is'nt.Más explicaciones :
La conversión estática realiza conversiones entre tipos compatibles . Es similar al elenco de estilo C, pero es más restrictivo. Por ejemplo, el reparto de estilo C permitiría que un puntero entero apunte a un carácter.
Como esto da como resultado un puntero de 4 bytes (un puntero al tipo de datos de 4 bytes) que apunta a 1 byte de memoria asignada, escribir en este puntero causará un error de tiempo de ejecución o sobrescribirá alguna memoria adyacente.
A diferencia de la conversión de estilo C, la conversión estática permitirá que el compilador verifique que los tipos de datos de puntero y puntero sean compatibles, lo que permite al programador detectar esta asignación de puntero incorrecta durante la compilación.
También puede consultar esta página para obtener más explicaciones sobre los moldes de C ++: haga clic aquí
fuente
Consulte una comparación de los operadores de conversión de C ++ .
fuente
fuente
Una gran publicación que explica diferentes moldes en C / C ++, y lo que realmente hace el elenco de estilo C: https://anteru.net/blog/2007/12/18/200/index.html
fuente
static_cast
comprueba en tiempo de compilación que la conversión no es entre tipos obviamente incompatibles. Al contrariodynamic_cast
, no se verifica la compatibilidad de tipos en tiempo de ejecución. Además, lastatic_cast
conversión no es necesariamente segura.static_cast
se utiliza para convertir de puntero a clase base a puntero a clase derivada, o entre tipos nativos, como enum a int o float a int.El usuario de
static_cast
debe asegurarse de que la conversión sea segura.El elenco de estilo C no realiza ninguna comprobación, ni en la compilación ni en el tiempo de ejecución.
fuente
Dado que hay muchos tipos diferentes de conversión, cada uno con una semántica diferente, static_cast <> le permite decir "Estoy haciendo una conversión legal de un tipo a otro", como de int a double. Un elenco simple de estilo C puede significar muchas cosas. ¿Estás subiendo / bajando? ¿Estás reinterpretando un puntero?
fuente