2010-08-26 11 views
33

Mi entendimiento es que C++ reinterpret_cast y el puntero C elenco es simplemente un una funcionalidad en tiempo de compilación y que no tiene ningún costo de rendimiento en absoluto.reinterpret_cast fundido costó

Es esto cierto?

Respuesta

49

Es una buena suposición para empezar. Sin embargo, el optimizador puede estar restringido en cuanto a 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 lanzas un int a un puntero, el optimizador es probable que no tienen idea de lo que ese puntero podría estar apuntando a. 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.

+1

No creo que "por lo general no" fue la respuesta que pretendía para la pregunta "¿es esto cierto?" –

+0

@Rob Kennedy: Eh, sí. Reformulado – MSalters

+1

muchas gracias por esta respuesta. Tal vez en ese caso uno puede insinuar a GCC con la palabra clave register (!?). – fulmicoton

0

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

+2

'static_cast' puede tener costos de tiempo de ejecución también; aunque generalmente es solo un ajuste de puntero único, o código para convertir un tipo en otro (como un 'int' en un' float') –

+0

¿No 'static_cast' también llamará a las conversiones definidas por el usuario? El costo de tiempo de ejecución sobre ellos no tiene límites. –

+0

Derecha, static_cast tiene un costo de tiempo de ejecución en el caso de la conversión de tipo (no de puntero). Mi punto es que dynamic_cast es el único tipo de conversión que tiene un costo de tiempo de ejecución adicional, en relación con el lanzamiento de C. –

5

Correcto. 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.

0

que tienes razón, pero pensar en ello: reinterpret_cast significa tal vez un mal diseño o que usted está haciendo algo muy bajo nivel.

dinámica a cielo lugar que le costará algo, porque tiene que buscar en una tabla de búsqueda en tiempo de ejecución.

+0

'dynamic_cast' es más parecido a' static_cast' con la comprobación del tiempo de ejecución en lugar de 'reinterpret_cast'. No puede lanzar tipos polimórficos con 'reinterpreT_cast'. –

+1

@Billy ONeal: puedes pero no polimórficamente consciente. –

0

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 ya que una matriz int podría provocar que la arquitectura de destino lance una interrupción, ya que diferentes tipos pueden tener diferentes reglas de alineación.

Primero debes ser el primero y preocúpate por la eficiencia.

4

estilo C arroja en C++ intentará un static_cast primera y única realizar una reinterpret_cast si un molde estático no puede ser realizada. 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.