有时在编写基准时,我发现使用"不透明"函数会阻止优化器完全删除变量.在gcc和clang上我有一个使用内联汇编的实现,它似乎在我到目前为止所测试的所有情况下都能正常工作.这是我感兴趣的一个简单例子(关于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);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码生成以下程序集:
movl $10, %eax
addl $5, %eax
ret
Run Code Online (Sandbox Code Playgroud)
而没有它产生的不透明功能:
movl $15, %eax
ret
Run Code Online (Sandbox Code Playgroud)
我如何为visual studio编译器(特别是2013)编写等效的opaque函数?