C语言标准是否规定了对全局寄存器变量的支持
我读到gcc提供了将全局变量定义为寄存器存储变量的支持。我想知道的是,这些标准对这种支持是否有任何规范。否。这些标准没有规定任何类似的功能。存储类C语言标准是否规定了对全局寄存器变量的支持,c,global-variables,storage-class-specifier,register-keyword,C,Global Variables,Storage Class Specifier,Register Keyword,我读到gcc提供了将全局变量定义为寄存器存储变量的支持。我想知道的是,这些标准对这种支持是否有任何规范。否。这些标准没有规定任何类似的功能。存储类寄存器的行为类似于自动,不能用于全局变量 根据经验,某台机器固有的一切都不是标准C的一部分。首先也是最重要的。编译器的工作是分配“寄存器存储变量”(如果有)C标准没有规定任何与此相关的强制性内容 也就是说 根据C11,第§6.9章,全局变量不能用寄存器存储类定义 存储类说明符auto和register不得出现在外部声明的声明说明符中 使用寄存器不保
寄存器
的行为类似于自动
,不能用于全局变量
根据经验,某台机器固有的一切都不是标准C的一部分。首先也是最重要的。编译器的工作是分配“寄存器存储变量”(如果有)
C
标准没有规定任何与此相关的强制性内容
也就是说
- 根据
,第§6.9章,全局变量不能用C11
存储类定义 存储类说明符寄存器
和auto
不得出现在外部声明的声明说明符中register
- 使用
不保证在第§6.7.1章(重点)寄存器中分配 使用存储类说明符寄存器
声明对象的标识符时,建议尽快访问对象此类建议的有效程度由实施定义。register
寄存器不能用于全局变量。C11 6.9/2中包括了这一点:
约束
存储类说明符auto
和register
不得出现在外部声明的声明说明符中
这里,外部声明是指不在函数内的任何声明。(不要与外部链接或外部链接混淆)。不受C99或C11标准的支持或允许(请参阅或回答)
作为扩展,接受
要声明寄存器中的全局int
变量a5
。。。这很少有用,您需要了解GCC是如何生成代码和分配注册表的,ABI的调用约定是什么。。。能够毫无恐惧地使用它。。。顺便说一句,这可能会削弱GCC的优化能力
但是它是特定于GCC的,Clang/LLVM确实支持该扩展,即使它支持其他几个GCC扩展(例如computedgoto
-s,…)有一种常见的误解,即C的关键字register
谈论硬件寄存器。这可能是这个概念的起源,但在现代C语言中,这不是目的。寄存器
的唯一实际效果是,在这样的beast上不允许使用&
它们可以以编译器想要的任何方式、硬件寄存器、指令立即执行或在堆栈上实现,您不知道。您知道的是,寄存器
变量不能与其他变量别名
为了更直接地回答您的问题,文件范围中的noregister
不是C语言的一部分。如果可以的话,这将允许我们声明几乎任何基的register const
变量,这可以作为某种类型的变量
将硬件寄存器映射到特定变量是编译器提供的扩展,例如gcc。Gcc的特性作为扩展,也可以在文件范围内工作。但这是非常禁止的,因为通常CPU没有很多硬件寄存器可供使用。如果一个程序需要大量使用的少量全局变量,将所有这些变量放入一个结构并专用一个寄存器来保存它们的地址,这样在访问这些变量时就无需加载索引寄存器。在大型嵌入式系统上可能不常见,但在小型系统上有时非常有用。我想知道为什么标准禁止使用带有全局变量的寄存器限定符,因为这样做可以改进优化,即使没有全局寄存器分配。给定extern-int-foo;外部内部*条代码>代码foo++*bar^=1;foo++*bar^=2代码>必须按顺序执行所有四个步骤。如果foo
可以注册合格,则操作可以重新排序为foo+=2*bar^=3代码>。
register int *foo asm ("a5");