Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言标准是否规定了对全局寄存器变量的支持_C_Global Variables_Storage Class Specifier_Register Keyword - Fatal编程技术网

C语言标准是否规定了对全局寄存器变量的支持

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不得出现在外部声明的声明说明符中 使用寄存器不保

我读到gcc提供了将全局变量定义为寄存器存储变量的支持。我想知道的是,这些标准对这种支持是否有任何规范。

否。这些标准没有规定任何类似的功能。存储类
寄存器
的行为类似于
自动
,不能用于全局变量


根据经验,某台机器固有的一切都不是标准C的一部分。

首先也是最重要的。编译器的工作是分配“寄存器存储变量”(如果有)
C
标准没有规定任何与此相关的强制性内容

也就是说

  • 根据
    C11
    ,第§6.9章,全局变量不能用
    寄存器
    存储类定义

    存储类说明符
    auto
    register
    不得出现在外部声明的声明说明符中

  • 使用
    寄存器
    不保证在第§6.7.1章(重点)寄存器中分配

    使用存储类说明符
    register
    声明对象的标识符时,建议尽快访问对象此类建议的有效程度由实施定义。


寄存器不能用于全局变量。C11 6.9/2中包括了这一点:

约束

存储类说明符
auto
register
不得出现在外部声明的声明说明符中

这里,外部声明是指不在函数内的任何声明。(不要与外部链接或外部链接混淆)。

不受C99或C11标准的支持或允许(请参阅或回答)

作为扩展,接受

要声明寄存器中的全局
int
变量
a5
。。。这很少有用,您需要了解GCC是如何生成代码和分配注册表的,ABI的调用约定是什么。。。能够毫无恐惧地使用它。。。顺便说一句,这可能会削弱GCC的优化能力


但是它是特定于GCC的
,Clang/LLVM确实支持该扩展,即使它支持其他几个GCC扩展(例如computed
goto
-s,…)

有一种常见的误解,即C的关键字
register
谈论硬件寄存器。这可能是这个概念的起源,但在现代C语言中,这不是目的。
寄存器
的唯一实际效果是,在这样的beast上不允许使用
&

它们可以以编译器想要的任何方式、硬件寄存器、指令立即执行或在堆栈上实现,您不知道。您知道的是,
寄存器
变量不能与其他变量别名

为了更直接地回答您的问题,文件范围中的no
register
不是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");