这么有限的寄存器,怎么会有这么多的寄存器变量呢?

the*_*ish 3 c variables assembly microprocessors

我在玩 C 时,我意识到,如果我声明了一堆寄存器变量,这些值不会被覆盖吗?从我从组装中可以看出,微处理器中没有大量寄存器,不足以满足我创建的需求。C 如何保留所有值?

Kei*_*son 5

没有要求声明的所有变量都register必须保存在 CPU 寄存器中。

这是 C 标准所说的:

具有存储类说明符寄存器的对象的标识符声明建议对对象的访问尽可能快。这些建议的有效程度是由实施定义的。

参考:ISO C11 N1570 草案,6.7.1 第 6 段。请注意,它甚至没有提到 CPU 寄存器。

符合标准的编译器可以简单地忽略所有register关键字(除了对获取register对象的地址施加一些限制)。

实际上,大多数编译器只会register在 CPU 寄存器中放置尽可能多的变量。

事实上,现代优化编译器可能比大多数程序员更擅长寄存器分配——特别是因为他们可以在每次修改程序后重新编译程序时重新计算寄存器映射。

现在的普遍观点是register关键字没有提供太多好处。


fuz*_*fuz 5

旧的编译器会为变量分配尽可能多的寄存器register(在某些情况下,这个数字是 0),并在堆栈上分配剩余的变量。

现代编译器通常会忽略该register关键字。它们采用复杂的寄存器分配器,自动在寄存器中保留尽可能多的变量。

register您可以信赖的唯一效果是,如果您尝试获取寄存器变量的地址,您会收到一条诊断消息。否则,寄存器变量的行为就像自动变量一样。