现在我在这里学习存储类。他似乎对自动存储类和寄存器存储类解释了同样的事情。他唯一区分两者的是寄存器存储类存储在CPU寄存器中。这些存储类之间有什么区别吗?寄存器存储类的任何用途?在某些 C 编译器上是否默认注册关键字?
register int x = 5;
auto int y = 3;
现在我在这里学习存储类。他似乎对自动存储类和寄存器存储类解释了同样的事情。他唯一区分两者的是寄存器存储类存储在CPU寄存器中。这些存储类之间有什么区别吗?寄存器存储类的任何用途?在某些 C 编译器上是否默认注册关键字?
register int x = 5;
auto int y = 3;
register存储类并不意味着对象将存储在寄存器中。标准说:
使用存储类说明符为对象声明标识符
register建议尽可能快地访问该对象。此类建议的有效程度由实施定义。
(引用来自 ISO C 标准的N1570草案,第 6.7.1 节第 6 段。)
将对象存储在 CPU 寄存器中而不是内存中是实现此目的的一种方法,但不是唯一的方法。
现代编译器(至少根据常识)可能比您更好地决定哪些变量应该存储在寄存器中以提高速度,因此使用register关键字可能除了干扰编译器的优化之外不会做任何事情。
register也使得获取对象的地址是非法的(即使它存储在内存中)。
它基本上是早期编译器(1970 年代)的遗留物,没有执行现代编译器所做的复杂优化。对于这样的编译器register可以显着提高性能。
(我相信,现代编译器首先假设所有变量都可以在寄存器中分配,并且仅在必要时将它们“溢出”到内存中,因为需要变量的地址或因为没有足够的寄存器可用。)