2

我的(c++ .Net Win32 控制台)代码中有一个for循环,它必须尽可能快地运行。所以我需要让编译器使用寄存器而不是将其存储在RAM中。

MSDN 说:

register 关键字指定变量将存储在机器寄存器中,如果可能的话

这是我尝试过的:

for(register int i = 0; i < Size; i++)

当我查看编译器生成的反汇编代码时,我看到:

012D4484  mov         esi,dword ptr [std::_Facetptr<std::codecvt<char,char,int> >::_Psave+24h (12DC5E4h)]  
012D448A  xor         ecx,ecx  
012D448C  push        edi  
012D448D  mov         edi,dword ptr [std::_Facetptr<std::codecvt<char,char,int> >::_Psave+10h (12DC5D0h)]  
012D4493  mov         dword ptr [Size],ebx  
012D4496  test        ebx,ebx  
012D4498  jle         FindBestAdd+48h (12D44B8h)  //FindBestAdd is the function the loop is in
012D449A  lea         ebx,[ebx]  

我希望汇编代码不会生成dword ptrwhere I usedregister关键字。

那么,我怎么知道编译器是否可以使用寄存器以及我应该怎么做才能强制编译器直接从寄存器读取/写入寄存器。

4

2 回答 2

14

register关键字只是一个提示,大多数现代编译器都会忽略它。本质上,这是因为编译器比程序员更擅长优化和找出应该放在寄存器中的内容。

因此,您不能强制编译器使用寄存器,即使可以也不应该。如果您想要最佳速度,请在编译器设置中打开最大优化级别。

于 2012-12-07T13:35:21.800 回答
4

在您的情况下,如果您提供正确的优化选项,编译器很可能会使用寄存器。

通常,强制变量进入寄存器的唯一方法是使用内联汇编。

于 2012-12-07T13:39:00.123 回答