static_cast reinterpret_cast c++ c reinterpret-cast

static_cast - reinterpret_cast c++



reinterpretar_castcast costo (6)

Está bien. Ningún costo aparte de cualquier ganancia / pérdida en el rendimiento para realizar las instrucciones en el nuevo ancho, lo que podría agregar, es solo una preocupación en casos excepcionales. Lanzar entre punteros en todas las plataformas de las que he oído hablar tiene un costo cero y ningún cambio de rendimiento en absoluto.

Tengo entendido que C ++ reinterpret_cast y C puntero fundido es solo una funcionalidad de tiempo de compilación y que no tiene ningún costo de rendimiento.

¿Es esto cierto?


Las versiones de estilo C en C ++ intentarán primero un static_cast y solo realizarán una reinterpret_cast si no se puede realizar un lanzamiento estático. Un static_cast puede cambiar el valor del puntero en el caso de una herencia múltiple (o cuando se transfiere una interfaz a un tipo concreto), este cálculo de compensación puede implicar una instrucción de máquina adicional. Esto será, como máximo, 1 instrucción de la máquina, realmente muy pequeña.


Sí, es cierto. El tipo de conversión que tiene un costo de tiempo de ejecución es dynamic_cast.


Tienes razón, pero piénsalo: reinterpretar_cast significa quizás un mal diseño o que estás haciendo algo de muy bajo nivel.

En cambio dinámico, le costará algo, porque tiene que buscar en una tabla de búsqueda en tiempo de ejecución.


reinterpret_cast no incurre en costo de tiempo de ejecución. Sin embargo, debe tener cuidado, ya que cada uso de reinterpret_cast está definido por la implementación. Por ejemplo, es posible reinterpretar una matriz char como una matriz int podría hacer que la arquitectura de destino lance una interrupción, ya que diferentes tipos pueden tener diferentes reglas de alineación.

Primero corrija, luego preocúpese por la eficiencia.


Es una buena suposición para empezar. Sin embargo, el optimizador puede estar restringido en lo que puede asumir en presencia de un reinterpret_cast<> o molde de puntero C. Entonces, a pesar de que el elenco en sí no tiene instrucciones asociadas, el código resultante es más lento.

Por ejemplo, si lanza un int a un puntero, es probable que el optimizador no tenga idea de a qué apunta ese puntero. Como resultado, probablemente tenga que suponer que una escritura a través de ese puntero puede cambiar cualquier variable. Eso supera optimizaciones muy comunes, como el almacenamiento de variables en los registros.