Tengo mi propia implementación para segmentos de código de tiempo crítico. He estado investigando por un tiempo un código de tiempo crítico para ralentizar y he descubierto que esta implementación consume alrededor del 2% del código de tiempo crítico que he optimizado:
#define UTILITY_UNUSED(exp) (void)(exp)
#define UTILITY_UNUSED2(e0, e1) UTILITY_UNUSED(e0); UTILITY_UNUSED(e1)
#define ASSERT_EQ(v1, v2) { UTILITY_UNUSED2(v1, v2); } (void)0
El código de tiempo crítico ha utilizado las ASSERT*
definiciones con fines de depuración, pero en el lanzamiento claramente se ha cortado, pero ... Parece que este produce un código un poco más rápido en Visual Studio 2015 Update 3
:
#define UTILITY_UNUSED(exp) (void)(false ? (false ? ((void)(exp)) : (void)0) : (void)0)
#define UTILITY_UNUSED2(e0, e1) (void)(false ? (false ? ((void)(e0), (void)(e1)) : (void)0) : (void)0)
La razón es doble false ?
expresión. De alguna manera produce un código un poco más rápido en el lanzamiento con la máxima optimización.
No sé por qué esto es más rápido (parece un error en la optimización del compilador), pero al menos es una mejor solución para ese caso de código.
Nota : Lo más importante aquí es que un código de tiempo crítico se ralentiza sin las afirmaciones anteriores o macros no utilizadas en el lanzamiento. En otras palabras, la doble false ?
expresión ayuda sorprendentemente a optimizar un código.