Mam własną implementację dla krytycznych czasowo segmentów kodu. Przez jakiś czas badałem kod krytyczny czasowo dla spowolnienia i odkryłem, że ta implementacja pochłania około 2% czasu krytycznego kodu, który został zoptymalizowany:
#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
Kod krytyczny czasowo używał ASSERT*
definicji do celów debugowania, ale w wydaniu wyraźnie został odcięty, ale ... Wygląda na to, że ten tworzy nieco szybszy kod w 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)
Powód ma podwójny false ?
wyraz. W jakiś sposób generuje nieco szybszy kod przy maksymalnej optymalizacji.
Nie wiem, dlaczego jest to szybsze (wydaje się, że jest to błąd w optymalizacji kompilatora), ale przynajmniej jest to lepsze rozwiązanie dla tego przypadku kodu.
Uwaga : Najważniejsze jest to, że krytyczny czasowo kod zwalnia bez powyższych potwierdzeń lub nieużywanych makr w wydaniu. Innymi słowy, podwójne false ?
wyrażenie w zaskakujący sposób pomaga zoptymalizować kod.