簡體   English   中英

在C ++中注冊存儲說明符

[英]Register storage specifier in C++

我很好奇知道C/C++register存儲說明符的行為。 以下程序在C++有效,但在C情況下無效。

int main()
{
        register int i;
        int* b = &i; // Valid in C++ but not in C
}

那么,我的問題我, 為什么C ++允許地址運算符(&)到寄存器變量?

PS:我知道寄存器存儲說明符在現代編譯器中已棄用。

您的答案可以在這里找到:

http://en.cppreference.com/w/cpp/language/storage_duration

在C語言中,不能獲取寄存器變量的地址,但是在C ++語言中,聲明為register的變量與沒有任何存儲類說明符的聲明變量在語義上沒有區別。

在C語言標准化之前,C和C ++有所分歧。 兩者都使用了register關鍵字,但是只有C添加了對&運算符的限制。

回顧歷史,C ++ 98標准說,

register說明符與auto說明符具有相同的語義,並帶有實現的提示,即聲明的對象將大量使用。 [ 注意:提示可以忽略,在大多數實現中,如果使用對象的地址,則將忽略提示。 尾注 ]

隨后不推薦使用,這與通過語義限制進行增強相反。 計划在即將發布的C ++ 17標准中將其刪除。

auto后來在C ++ 11中被重新利用。它的舊含義與局部變量的默認存儲相同。)

那么,我的問題我, 為什么C ++允許地址運算符(&)到寄存器變量?

答案是:
因為C和C ++是不同的語言,並且遵循其他答案中指出的不同標准。

區別在於C ++標准(7.1.1存儲類規范)中的引號

3寄存器說明是實現的暗示,即聲明的變量將被大量使用。 [注意:提示可以忽略, 在大多數實現中,如果采用變量的地址,則將忽略提示。 不建議使用此用法(請參閱D.2)。 —尾注]

暫無
暫無

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

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