C语言标准是否指定了对全局寄存器变量的支持
我读到gcc提供了将全局变量定义为寄存器存储变量的支持。 我想知道的是标准是否有这种支持的任何规范。
C的关键字register
涉及硬件寄存器,这是一种常见的误解。 这可能是这个概念的起源,但在现代C中,这不是目的。 register
唯一真正的效果是,这种野兽不允许使用&
。
它们可以以编译器想要的任何方式实现,硬件寄存器,指令即时,或者在堆栈中,您不会知道。 你知道的是register
变量不能与其他变量别名。
为了更直接地回答您的问题,文件范围中的register
不是C语言的一部分。 如果它会,那将允许我们声明几乎任何基数的register const
变量,它可以作为某种全局常量 。
将硬件寄存器映射到特定变量是编译器提供的扩展,例如gcc。 Gcc的function作为扩展,也适用于文件范围。 但这是非常令人望而却步的,因为通常CPU没有多余的硬件寄存器。
register
不能用于全局变量。 这由C11 6.9 / 2涵盖:
约束
存储类说明符
auto
和register
不应出现在外部声明中的声明说明符中。
这里, 外部声明是指任何不在函数内的声明。 (不要与extern
或外部联系混淆)。
首要的是。 “寄存器存储变量”的分配,如果有的话,是编译器的工作。 C
标准没有规定任何强制性相同的内容。
那说,
-
根据
C11
,第6.9章,无法使用register
存储类定义全局变量存储类说明符
auto
和register
不应出现在外部声明中的声明说明符中。 -
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的一部分。