[英]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涵蓋:
約束
存儲類說明符
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的特殊 ,鏘/ LLVM並沒有支持擴展,即使是支持其他幾個GCC擴展(例如計算goto
-s,...)。
不。標准沒有指定任何這樣的功能。 存儲類register
行為類似於auto
,不能用於全局變量。
根據經驗,某台機器固有的所有東西都不是標准C的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.