我想知道指针是否可以指向CPU寄存器,如果不行,尽可能使用引用而不是指针,因为引用对象可能驻留在某个寄存器中,但由指针指向的对象可能不会。
www1.microchip.com/downloads/en/DeviceDoc/41413A.pdf
显示文件未找到。请更新它。 - ussvoid __fastcall test(int i, int * ptr, int & ref)
{
_i$ = 8 ; size = 4
_ref$ = 12 ; size = 4
?test@@YIXHPAHAAH@Z PROC ; test, COMDAT
; _ptr$ = ecx
; 8 : global_int1 += *ptr;
mov edx, DWORD PTR [ecx]
; 9 :
; 10 : global_int2 += ref;
mov ecx, DWORD PTR _ref$[esp-4]
mov eax, DWORD PTR _i$[esp-4]
add DWORD PTR ?global_int1@@3HA, edx ; global_int1
mov edx, DWORD PTR [ecx]
add DWORD PTR ?global_int2@@3HA, edx ; global_int2
; 11 :
; 12 : int & ref2 = i;
; 13 : global_int3 += ref2;
add DWORD PTR ?global_int3@@3HA, eax ; global_int3
; 14 :
; 15 : global_int4 += i;
add DWORD PTR ?global_int4@@3HA, eax ; global_int4
我认为您想要表达的是引用所指向的整数值是否存储在寄存器中。
通常,大多数编译器将引用视为指针的一种。也就是说,引用只是具有特殊“解引用”语义的指针。因此,与适合存储在寄存器中的整数值不同,引用通常没有优化。引用和指针之间唯一的区别在于引用必须(但未被编译器强制执行)引用有效对象,而指针可以为NULL。
指针指向内存位置。因此,使用指针无法访问CPU寄存器。引用是指针的较弱版本(无法对引用执行算术运算)。但是编译器通常会将变量放入寄存器中以执行操作。例如,编译器可以将循环计数器放入CPU寄存器中以便快速访问。或者将不占用太多空间的函数参数放入寄存器中。在C语言中有一个关键字可以用来请求编译器将某个变量放入CPU寄存器中。该关键字是register
:
for (int i = 0; i < I; i++)
for (int j = 0; j < J; j++)
for (register int k = 0; k < K; k++)
{
// to do
}
register
关键字本质上是对编译器的一个空洞请求,即它可以完全而且默默地被忽略。 - Nick TMichael Burr 是正确的。CPU 寄存器没有内存地址。