为什么我可以获取寄存器变量的地址?

时间:2016-07-04 01:58:42

标签: c++

引自“Thinking in c ++”一书中有关寄存器变量的部分:“寄存器变量的使用存在限制。您不能获取或计算寄存器变量的地址。寄存器变量只能在block(你不能拥有全局或静态寄存器变量)。“

所以我写了这段程序来测试:

int global = 2;
// error
// register int global2 = 3;

int main() {
    register int local2 = 2;
    cout << local2 << " " << &local2 << endl;
}

然而,g ++不会产生错误,并打印出local2的地址。那么为什么我可以在没有错误的情况下获取地址呢?

2 个答案:

答案 0 :(得分:5)

在历史上,您无法获取register变量的地址。

现在这只是一个历史性的脚注。当前的C ++标准规定了register关键字

  

...指定命名变量具有自动存储持续时间   (3.7.3)。

换句话说,它意味着......没什么。不能对register变量采用地址的限制不再是当前C ++标准的一部分。

答案 1 :(得分:1)

g ++选择不遵循register声明。它不必,并且在这种情况下可能选择忽略它,或者足够聪明,因为你取得变量的地址就把它关掉。

很久以前我们尝试用C语言编写汇编语言,我们对处理器有多少寄存器了解得太多,并且认为我们比分配CPU资源的那个时代的编译器更聪明。

我们放弃了这个概念,因为处理器变得更加复杂,编译器变得更加先进(在现代英特尔处理器上,加载指令本身就是完整的),而且我们的湿件基本上保持不变。 / p>