如何强制 C++ 编译器使用寄存器
How to force c++ compiler to use registers?
我的(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
关键字只是一个提示,大多数现代编译器都会忽略它。从本质上讲,这是因为编译器比程序员更善于优化和弄清楚应该在寄存器中放置什么。
因此,您不能强制编译器使用寄存器,即使可以,也不应该这样做。如果需要最佳速度,请在编译器设置中打开最大优化级别。
在您的情况下,如果您提供正确的优化选项,编译器很可能会使用寄存器。
通常,强制变量进入寄存器的唯一方法是使用内联程序集。
相关文章:
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- Atmel Studio:返回一个包含数组的寄存器
- 使用 googletest 测试嵌入式C++代码时处理外设寄存器的重复符号
- 告诉编译器我希望变量始终存储在寄存器中的正确方法是什么
- 视觉 C++编译器在计算其参数之前是否允许将函数 ptr 存储在寄存器中?
- 库达寄存器编译器优化
- 如何强制 C++ 编译器使用寄存器
- 使用所有寄存器后的 MSVC 编译器行为
- 无法在类 'POINTER_REGS' 中找到溢出的寄存器(可能是编译器错误)
- 为什么编译器对原始/std数组使用XMM寄存器,而对向量不使用?