2012-04-27 11 views
5

Al usar Microsoft Visual C++ (no CLI, solo C++ nativo estándar) el ensamblaje en línea causa que la optimización se deshabilite para la función?¿Puede un bloque de montaje en línea (__asm) evitar la optimización de funciones?

Cuando revisé el uso de IDA, parte del código de función fuera del bloque parece cambiar, pero no estoy seguro de cuál es la causa. La función es (relativamente) simple, contiene manipulación de bits y algunas operaciones matemáticas, pero no llamadas externas.

Otras causas posibles que podía pensar son:

  • provisión adicional para habilitar la depuración en ensamblador en línea.
  • Alteraciones en el manejo de excepciones (aunque realmente no se ve así)
  • Inline parcial de otra cosa debido a una lógica de compilación desconocida.

¿Alguna idea?

Respuesta

13

Sí. Ver los artículos de MSDN: Optimizing Inline Assembly, así como Advantages of Inline Assembly

Desde el artículo:

La presencia de un bloque __asm en una función afecta a la optimización de varias maneras. Primero, el compilador no intenta optimizar el bloque __asm. Lo que escribes en lenguaje ensamblador es exactamente lo que obtienes. En segundo lugar, la presencia de un bloque __asm ​​afecta el almacenamiento de la variable de registro. El compilador evita el registro de variables en un bloque __asm si el contenido del registro se modificará mediante el bloque __asm. Finalmente, algunas otras optimizaciones de toda la función se verán afectadas por la inclusión del lenguaje ensamblador en una función.

+0

Ah, entonces desactiva la optimización de * algunos * pero no * todos *. Eso responde mi pregunta perfectamente. Gracias. – Polynomial

Cuestiones relacionadas