如何强制c ++编译器使用寄存器?

Biz*_*han 1 c++ compiler-construction performance assembly cpu-registers

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

MSDN说:

register关键字指定变量将存储在机器寄存器中(如果可能).

这是我试过的:

for(register int i = 0; i < Size; i++)
Run Code Online (Sandbox Code Playgroud)

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

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]  
Run Code Online (Sandbox Code Playgroud)

我期望汇编代码不生成dword ptr我使用register关键字的地方.

所以,我怎么会知道,如果有可能的编译器使用寄存器,我应该怎么做才能强制编译器直接读取/从/到寄存器写.

Age*_*ien 14

register关键字只是一个提示,并通过最现代的编译器忽略.从本质上讲,这是因为编译器在优化和确定寄存器中应该放置什么比编程器更好.

因此,您不能强制编译器使用寄存器,即使您可以也不应该这样做.如果需要最佳速度,请在编译器设置中启用最大优化级别.