因爲我知道在C中我們可以使用關鍵字「register」來向編譯器建議變量應該存儲在CPU寄存器中。涉及CPU指令的所有變量最終都將存儲在CPU寄存器中以便執行,這是不是真的?爲什麼我們需要建議一個變量存儲在寄存器中?
回答
register
關鍵字是一種告訴編譯器該變量被大量使用的方式。確實,通常必須將值暫時加載到寄存器中以對其執行計算。這個名字來源於這樣一種想法,即編譯器可能會將變量保存在寄存器中的整個持續時間範圍內,而不是隻在臨時用於計算時。
由於現代編譯器可以在程序員沒有幫助的情況下確定何時大量使用變量(以及何時不使用其地址),因此該關鍵字已過時用於優化。
如何確定範圍的「持續時間」? C中的塊? – woongiap 2010-09-30 07:54:36
編譯器確定您的持續時間 - 優化後可能少於或多於源代碼塊/範圍。如果該值未在範圍的後半部分使用,並且內存/寄存器可以有效地用於其他內容,則更少;如果該值以某種方式返回到當前塊之外,並且出於效率原因應該保持活動狀態當前範圍。 – 2010-09-30 08:06:21
-1:關鍵字不會過時。不幸的是,現在它與目標機器的寄存器沒有多大關係,但唯一的含義是你不能獲取該變量的地址。這可以是一個寶貴的優化提示,並且在安全性方面也很重要。它阻礙了你無意中暴露了堆棧變量的地址。 – 2010-09-30 08:30:50
在過去,編譯器並不像現在這樣聰明。這是編程人員向編譯器提示的,該變量應存儲在寄存器中,以便快速訪問/修改。今天,幾乎所有體面的編譯器都實現了聰明的寄存器分配算法,它們擊敗了人類的頭腦。
您應該不是使用register
關鍵字。這是一個古老的遺物,保持向後兼容性。大多數編譯器都會忽略它(默認情況下)。
可能有例外,但它們非常罕見,請查閱您的編譯器手冊。
是不是所有涉及CPU指令的變量最終都會存儲在CPU寄存器中執行?
是的,的確如此。但是CPU寄存器是有限的,所以變量通常從'普通'存儲器加載/存儲,並且只是簡單地存在於寄存器中。 register
關鍵字是(是)指示應該佔用更長寄存器的高優先級變量的一種方式。像for(i = 0; ...)
中的i
一樣。
大多數變量將加載進入寄存器很短的時間...只要有必要做什麼需要與他們做什麼。 register
關鍵字暗示他們應該在那裏保留。
雖然編譯器的優化已經變得非常好,但register
關鍵字並不是很有幫助。事實上,如果你的編譯器根本不尊重它(甚至不這樣做),它甚至會讓你感到困惑(通過捆綁編譯器的手,使某些優化成爲不可能)。所以現在這是一個非常糟糕的主意。
感謝您的回答,只是caf是第一個提供正確答案的人 – woongiap 2010-09-30 08:22:22
- 1. 爲什麼編譯器將變量存儲在寄存器中?
- 2. 爲什麼建立普通布爾MRSW寄存器需要2個寄存器?
- 3. 存儲字節在寄存器變量
- 4. 爲什麼我們需要創建一箇中斷向量表?
- 5. 爲什麼我們在創建存儲庫時需要創建xxxCustom和xxxImpl類?
- 6. 當我們已經有程序計數器寄存器時,爲什麼我們需要一個堆棧指針寄存器?
- 7. 爲什麼我們需要在編譯器中分配存儲空間
- 8. 一個變量應該存儲在一個寄存器中多久?
- 9. 爲什麼我們需要使用存儲過程?
- 10. 爲什麼我們需要瞬態故障處理存儲?
- 11. 存儲庫模式 - 爲什麼我們需要接口?
- 12. 是什麼存儲「存儲變量所需的內存」的變量和要求的規格有什麼區別?
- 13. 爲什麼我需要在我的settings.xml文件中指定一個存儲庫
- 14. 訪問一個SSE寄存器變量
- 15. 爲什麼值被存儲在寄存器0x605040c,而不是12?
- 16. 在CPU寄存器中分配寄存器變量的標準?
- 17. 爲什麼我們需要創建存儲過程進行備份?
- 18. AVR在C - 存儲變量中的寄存器值
- 19. 將變量存儲在CPU寄存器中
- 20. 存儲在寄存器中的變量的地址
- 21. 需要一個php緩存建議
- 22. 我是編程新手,需要將以下輸入存儲在一個數組中。有什麼建議麼?
- 23. 爲什麼LLVM需要一個新的臨時寄存器標識符
- 24. 什麼是線程本地存儲?我們爲什麼需要它?
- 25. 爲什麼在maven中需要鏡像,而我們可以修改存儲庫?
- 26. 我們爲什麼需要將會話存儲在數據庫中?
- 27. 在FPGA中需要大量存儲器
- 28. 爲什麼只有四個寄存器?
- 29. 是什麼使一個值不安全的存儲在寄存器中?
- 30. 爲什麼我們在抽象類存在時需要接口?
這個相關的問題可能會有幫助:[「在C中註冊關鍵字?](http://stackoverflow.com/questions/578202/register-keyword-in-c) – 2010-09-30 07:46:59