在C编程语言中,我们不允许将address-of运算符(&)与使用寄存器存储类说明符声明的变量一起使用.
它给 error: address of register variable ‘var_name’ requested
但是如果我们制作一个c ++程序并执行相同的任务(即使用&with寄存器存储变量),它不会给我们任何错误.
例如.
#include <iostream>
using namespace std;
int main()
{
register int a;
int * ptr;
a = 5;
ptr = &a;
cout << ptr << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出: -
0x7ffcfed93624
Run Code Online (Sandbox Code Playgroud)
那么这必须是C++的一个额外功能,但问题在于C和C++中寄存器类存储的区别.
Ala*_*kes 21
在C++中故意删除了取得地址的限制 - 没有任何好处,它使语言更复杂.(例如,如果绑定对register变量的引用会发生什么?)
该register关键字一直没有多大用处了很多年-编译器是在搞清楚该怎么把寄存器本身非常好.实际上,在C++中,该关键字目前已被弃用,最终将被删除.
该register存储类最初暗示编译器的变量,以便有资格为被如此频繁,保持它的价值在内存将是一个性能缺点使用.在广阔的大多数CPU架构(也许不是SPARC?甚至不能肯定有一个反例)从内存中没有先加载一个或两个不能执行两个变量之间的任何操作成其寄存器.将变量从存储器加载到寄存器中并在操作后将它们写回存储器所需的CPU周期比操作本身多出许多倍.因此,如果频繁使用变量,则可以通过为其预留寄存器而不打扰存储器来实现性能增益.
但是,这样做有各种各样的要求.每种CPU架构都有许多不同之处:
register变量.register变量不适合寄存器的情况.由于C旨在独立于平台,因此标准无法强制执行这些限制.换句话说,虽然可能无法为register只有4个机器寄存器的系统编译20个变量的过程,但C程序本身不应该是"错误的",因为没有逻辑上的原因,机器不能有20个寄存器.因此,register存储类始终只是一个提示,如果特定目标平台不支持它,编译器可以忽略它.
无法引用寄存器是不同的.阿register是特别不保存在存储器中更新,不保持当前如果改变到存储器制成; 这就是存储类的重点.由于它们不打算在内存中具有保证的表示,因此它们在逻辑上不能在内存中具有对可能获得指针的外部代码有意义的地址.寄存器没有自己CPU的地址,并且它们几乎从不具有任何协处理器可访问的地址.因此,任何试图获得对基准register是总是一个错误.C标准可以轻松地执行这一规则.
然而,随着计算的发展,一些趋势的发展削弱了register存储类本身的目的:
实际上,编译器现在非常善于将变量分配给寄存器,它们通常在优化方面比任何人都做得更好.他们当然知道你最常使用哪些,而不告诉他们.如果编译器需要遵守您的手动register提示,那么编译器(即不是标准或程序员)会产生这些优化会更复杂.编译器断然忽略它们变得越来越普遍.到C++存在时,它已经过时了.它包含在标准中以便向后兼容,以使C++尽可能接近C的正确超集.编译器遵守提示的要求以及因此强制执行提示可以遵守的条件的要求被削弱了因此.今天,存储类本身已被弃用.
因此,即使它仍然今天的情况(和将要等到电脑甚至不具有寄存器),你不能在逻辑上有一个CPU寄存器参考,期望的是,register 存储类将荣幸被这么长时间过去了,它标准要求编译器要求您在使用它时合乎逻辑是不合理的.