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

How to force c++ compiler to use registers?

本文关键字:寄存器 编译器 何强制 C++      更新时间:2023-10-16

我的(c ++ .Net Win32 Console)代码中有一个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]  

我希望汇编代码不会生成我使用关键字register dword ptr

那么,我怎么

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

register 关键字只是一个提示,大多数现代编译器都会忽略它。从本质上讲,这是因为编译器比程序员更善于优化和弄清楚应该在寄存器中放置什么。

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

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

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