reinterpretar el coste del reparto


Mi entendimiento es que C++ reinterpret_cast y C pointer cast es un una funcionalidad en tiempo de compilación y que no tiene ningún costo de rendimiento en absoluto.

¿Es esto cierto?

Author: fulmicoton, 2010-08-26

6 answers

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

Por ejemplo, si lanzas un int a un puntero, es probable que el optimizador no tenga idea de a qué podría apuntar ese puntero. Como resultado, probablemente tiene que asumir que una escritura a través de ese puntero puede cambiar cualquier variable. Que late optimizaciones muy comunes como el almacenamiento de variables en registros.

 51
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-14 13:54:47

Así es. Ningún costo que no sea cualquier ganancia/pérdida en el rendimiento para realizar instrucciones en el nuevo ancho, que podría agregar, es solo una preocupación en casos raros. El casting 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.

 5
Author: Matt Joiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 12:59:55

Los casts de estilo C en C++ intentarán primero un static_cast y solo realizarán un reinterpret_cast si no se puede realizar un cast estático. Un static_cast puede cambiar el valor del puntero en el caso de herencia múltiple (o al fundir una interfaz a un tipo concreto), este cálculo de desplazamiento puede implicar una instrucción de máquina adicional. Esto será como mucho 1 instrucción de la máquina tan realmente muy pequeña.

 4
Author: doron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 14:17:27

Sí, esto es cierto. El tipo de casting que tiene coste de tiempo de ejecución es dynamic_cast.

 0
Author: Alex F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 12:59:52

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

Dynamic-cast en su lugar le costará algo, porque tiene que buscar en una tabla de búsqueda en tiempo de ejecución.

 0
Author: vulkanino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 13:04:01

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 como implementación. Por ejemplo, es posible reinterpretar una matriz char como una matriz int podría causar que la arquitectura de destino genere una interrupción, porque diferentes tipos pueden tener diferentes reglas de alineación.

Primero haz lo correcto, luego preocúpate por la eficiencia.

 0
Author: Billy ONeal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 13:06:40