有时在编写基准测试时,我发现使用" opaque"阻止优化器完全删除变量的函数。在gcc和clang上我有一个使用内联汇编的实现,它似乎在我到目前为止所测试的所有情况下都能正常工作。以下是我感兴趣的一个简单示例(example on godbolt):
template<class T>
void opaque(T&& t)
{
asm volatile("" : "+r" (t));
}
int test(int a) { return a + 5; }
int main()
{
int a = 10;
opaque(a);
return test(a);
}
上面的代码生成以下程序集:
movl $10, %eax
addl $5, %eax
ret
然而,没有它产生的opaque函数:
movl $15, %eax
ret
我如何为visual studio编译器(特别是2013)写一个等效的opaque函数?