c++ visual-c++ intrinsics

c++ - ¿Por qué y cuándo usar__noop?



visual-c++ intrinsics (2)

El __noop intrinsic especifica que una función debe ignorarse y la lista de argumentos debe analizarse, pero no se genera ningún código para los argumentos. Está diseñado para su uso en funciones de depuración globales que toman un número variable de argumentos.

En su caso, el argumento es, obviamente, una expresión libre de efectos secundarios que puede optimizarse fácilmente, por lo que no importa.

Pero si la expresión del argumento tiene efectos secundarios o es tan compleja que el compilador no puede probar que termina normalmente y no tiene efectos secundarios, el uso de __noop evita la evaluación potencialmente costosa de esa expresión.

El segundo beneficio es que se comporta como una llamada de función con un número variable de argumentos sintácticamente. Por lo tanto, sustituirlo por una llamada de función no afecta el análisis del programa. Con algunos otros reemplazos (como la cadena vacía), eso podría ser un problema en algunas situaciones.

Estaba leyendo sobre __noop y el ejemplo de MSDN es

#if DEBUG #define PRINT printf_s #else #define PRINT __noop #endif int main() { PRINT("/nhello/n"); }

y no veo la ganancia por tener una macro vacía:

#define PRINT

El código generado es el mismo. ¿Cuál es un ejemplo válido de usar __noop que realmente lo hace útil?


#define PRINT extern int some_complicated_calculation(); PRINT("%d/n", some_complicated_calculation());

llamaría a la función aunque no quiera el resultado.

Usando __noop , la función no será llamada.

Usted podría (asumiendo que el compilador soporta macros variadic) definir PRINT para ignorar los argumentos; pero luego no se analizarán en absoluto, y pueden volverse inválidos si cambias el código a su alrededor sin compilar la variante que define PRINT para hacer algo. Al usar __noop , los argumentos aún se analizan, por lo que es más probable que sigan siendo válidos.