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

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

C的关键字register涉及硬件寄存器,这是一种常见的误解。 这可能是这个概念的起源,但在现代C中,这不是目的。 register唯一真正的效果是,这种野兽不允许使用&

它们可以以编译器想要的任何方式实现,硬件寄存器,指令即时,或者在堆栈中,您不会知道。 你知道的是register变量不能与其他变量别名。

为了更直接地回答您的问题,文件范围中的register不是C语言的一部分。 如果它会,那将允许我们声明几乎任何基数的register const变量,它可以作为某种全局常量 。

将硬件寄存器映射到特定变量是编译器提供的扩展,例如gcc。 Gcc的function作为扩展,也适用于文件范围。 但这是非常令人望而却步的,因为通常CPU没有多余的硬件寄存器。

register不能用于全局变量。 这由C11 6.9 / 2涵盖:

约束

存储类说明符autoregister不应出现在外部声明中的声明说明符中。

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

首要的是。 “寄存器存储变量”的分配,如果有的话,是编译器的工作。 C标准没有规定任何强制性相同的内容。

那说,

  • 根据C11 ,第6.9章,无法使用register存储类定义全局变量

    存储类说明符autoregister不应出现在外部声明中的声明说明符中。

  • register使用不保证在寄存器中的分配,章节§6.7.1( 强调我的

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

C99或C11标准不支持或不允许全局寄存器变量 (参见Sourav Ghosh或Matt McNabb的答案)。

作为延伸 , GCC接受

  register int *foo asm ("a5"); 

声明一个坐在寄存器a5全局 int变量…这很少有用,你需要了解GCC如何生成代码并分配registesr,你的ABI的调用约定是什么,…才能使用它没有恐惧……顺便说一下,它可能会削弱GCC优化能力。

但它是GCC特定的 ,Clang / LLVM不支持该扩展,即使它支持其他几个GCC扩展(例如计算goto -s,……)。

不。标准没有指定任何这样的function。 存储类register行为类似于auto ,不能用于全局变量。

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