引自“Thinking in c ++”一书中有关寄存器变量的部分:“寄存器变量的使用存在限制。您不能获取或计算寄存器变量的地址。寄存器变量只能在block(你不能拥有全局或静态寄存器变量)。“
所以我写了这段程序来测试:
int global = 2;
// error
// register int global2 = 3;
int main() {
register int local2 = 2;
cout << local2 << " " << &local2 << endl;
}
然而,g ++不会产生错误,并打印出local2的地址。那么为什么我可以在没有错误的情况下获取地址呢?
答案 0 :(得分:5)
在历史上,您无法获取register
变量的地址。
现在这只是一个历史性的脚注。当前的C ++标准规定了register
关键字
...指定命名变量具有自动存储持续时间 (3.7.3)。
换句话说,它意味着......没什么。不能对register
变量采用地址的限制不再是当前C ++标准的一部分。
答案 1 :(得分:1)
g ++选择不遵循register
声明。它不必,并且在这种情况下可能选择忽略它,或者足够聪明,因为你取得变量的地址就把它关掉。
很久以前我们尝试用C语言编写汇编语言,我们对处理器有多少寄存器了解得太多,并且认为我们比分配CPU资源的那个时代的编译器更聪明。
我们放弃了这个概念,因为处理器变得更加复杂,编译器变得更加先进(在现代英特尔处理器上,加载指令本身就是完整的),而且我们的湿件基本上保持不变。 / p>