对于时间关键的代码段,我有自己的实现。我一直在研究用于减速的时间关键代码,发现这个实现消耗了我正在优化的时间关键代码的 2%:
#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
时间关键代码已将ASSERT*
定义用于调试目的,但在发布时它显然已被删除,但是......似乎这个在以下位置产生了更快的代码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)
原因在于双重false ?
表达。它以某种方式在发布时产生了更快的代码,并具有最大的优化。
我不知道为什么这更快(似乎是编译器优化中的一个错误),但对于这种代码情况,它至少是一个更好的解决方案。
注意:这里最重要的是,如果没有上述断言或版本中未使用的宏,时间关键代码会变慢。换句话说,双重false ?
表达式出人意料地有助于优化代码。