簡體   English   中英

C語言標准是否指定了對全局寄存器變量的支持

[英]Do the C language standards specify support for global register variables

我讀到gcc提供了將全局變量定義為寄存器存儲變量的支持。 我想知道的是標准是否有這種支持的任何規范。

C的關鍵字register涉及硬件寄存器,這是一種常見的誤解。 這可能是這個概念的起源,但在現代C中,這不是目的。 ,真正的效果register了,就是&是不允許這樣的野獸。

它們可能以編譯器想要的任何方式實現,硬件寄存器,指令即時,或者在堆棧中,您不會知道。 你知道的是register變量不能與其他變量別名。

為了更直接地回答您的問題,文件范圍中的register不是C語言的一部分。 如果它會,那將允許我們聲明幾乎任何基數的register const變量,它可以作為某種全局常量

將硬件寄存器映射到特定變量是編譯器提供的擴展,例如gcc。 作為擴展,Gcc的功能也適用於文件范圍。 但這是非常令人望而卻步的,因為通常CPU沒有多余的硬件寄存器。

register不能用於全局變量。 這由C11 6.9 / 2涵蓋:

約束

存儲類說明符autoregister不應出現在外部聲明的聲明說明符中。

這里, 外部聲明是指任何不在函數內的聲明。 (不要與extern或外部聯系混淆)。

首先是最重要的。 “寄存器存儲變量”的分配(如果有的話)是編譯器的工作。 C標准沒有規定任何強制性相同的內容。

那說,

  • 根據C11 ,第6.9章,無法使用register存儲類定義全局變量

    存儲類說明符autoregister不應出現在外部聲明的聲明說明符中。

  • register使用不保證在寄存器中的分配,章節§6.7.1( 強調我的

    具有存儲類說明符register的對象的標識符聲明表明對對象的訪問盡可能快。 這些建議有效的程度是實施定義的。

C99或C11標准不支持或不允許全局寄存器變量 (參見Sourav GhoshMatt McNabb的答案)。

作為延伸GCC接受

  register int *foo asm ("a5");

聲明一個坐在寄存器a5全局 int變量...這很少有用,你需要了解GCC如何生成代碼並分配registesr,你的ABI的調用約定是什么,......能夠使用它沒有恐懼......順便說一下,它可能會削弱GCC優化能力。

但是,它是GCC的特殊 ,鏘/ LLVM並沒有支持擴展,即使是支持其他幾個GCC擴展(例如計算goto -s,...)。

不。標准沒有指定任何這樣的功能。 存儲類register行為類似於auto ,不能用於全局變量。

根據經驗,某台機器固有的所有東西都不是標准C的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM