使用registerer修饰符的注意点有关问题

使用registerer修饰符的注意点问题一本叫《C语言深度解剖》的书上的问题1.2.2 使用registerer修饰符的注意点

使用registerer修饰符的注意点问题
一本叫《C语言深度解剖》的书上的问题
1.2.2 使用registerer修饰符的注意点问题
疑点:register变量可能不存放在内存中,所以不能用取址运算符&来获取register变量的地址。
经调式发现register变量是可以用“&“来获取register变量的地址哦,而且地址是栈的范围内的地址
代码如下:
void main()
{
register int a=9;
cout<<a<<" "<<&a<<endl;
}
运行结果:9 0x0012ff74

只是不知我这种调试是否就一定正确,如果换其他编译器会如何,不过主要我还是想问
register变量可能不存放在内存中,所以不能用取址运算符&来获取register变量的地址。对吗?

[解决办法]
register是“建议”而非“强制”,类似于inline,inline函数如果作为回调函数(取了函数地址指针),inline自然失效,register取址后,当然也失效了

现代化的编程,基本没有使用register的需求,arm和x64寄存器多,编译器就会给你优化位寄存器存储
[解决办法]
你的"实验"是错误的。由于寄存器不在存储的编码空间内,因此寄存器被认为不属于存储的一部分,因此在C中register修饰的变量不能使用&运算符;但C++进行了折衷,对一个register变量进行&取地址时,就把该变量从寄存器移动到存储中,以返回一个地址。

请检查你在C还是C++中编译该代码。
[解决办法]
codeblock编译不过去


D:\code\test\222.c||In function 'main':|
D:\code\test\222.c|12|error: address of register variable 'a' requested|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 2 seconds) ===|

详细怎么要求,那位高手来解答一下,我也考虑个这个问题
[解决办法]
楼主啊,还是换本合格点的书看看吧。
[解决办法]

探讨

codeblock编译不过去


D:\code\test\222.c||In function 'main':|
D:\code\test\222.c|12|error: address of register variable 'a' requested|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 2 second……

[解决办法]
如果是纯C代码的话,那么在使用寄存器变量时,的确会出现register变量可能不存放在内存中,所以不能用取址运算符&来获取register变量的地址。其他语言我也不清楚。因为,寄存器的数量有限,编译器不可能将你定义的所有register变量放到寄存器中(比如,你定义了100个register变量,cpu再多也不会多大100多个寄存器了,即使有,也不会都来存放你的数据啊)。所以,C语言使用寄存器变量时,变量可能存放的位置不一定。同时,寄存器一般不会编址为内存地址,应该也不会做类似IO端口映射。

[解决办法]
而且,楼主不要误解2楼的意思,即便是C语言,register仍然是“建议”,只不过在“语法检查层面”禁止了取地址。

看如下反汇编
Assembly code
    int a = 1;00E8139E  mov         dword ptr [a],1      int b = 2;00E813A5  mov         dword ptr [b],2      register int c = 3;00E813AC  mov         dword ptr [c],3      register int d = 4;00E813B3  mov         dword ptr [d],4      register int e = 4;00E813BA  mov         dword ptr [e],4