在C++中使用const
時,是什麼讓你無法在機器的低層隱式傳遞一個非const的值?機器如何確定這是const
?什麼使const在機器的較低級別?
(除了一個事實,即const
意味着這意味着什麼...)
是它可能存儲在內存.rdata部分還是有時設置,使得它常量位或這是如何工作的?
任何人都可以澄清?
在C++中使用const
時,是什麼讓你無法在機器的低層隱式傳遞一個非const的值?機器如何確定這是const
?什麼使const在機器的較低級別?
(除了一個事實,即const
意味着這意味着什麼...)
是它可能存儲在內存.rdata部分還是有時設置,使得它常量位或這是如何工作的?
任何人都可以澄清?
const
主要是一個編譯時的事情;它並不意味着它們可能在運行時存儲在何處,或者它們是否可能在運行時受到保護。
在實踐中,編譯器可以選擇把常數在可執行文件,它可以由存儲器管理單元寫保護的程序部分(如果存在)。或者,編譯器可以將常量直接摺疊到代碼中,以使它們甚至不存在作爲可尋址位置。
或者,它可能不會做任何這些事情。
const
-ness幾乎總是由編譯器,僅此而已,無所不及執行。根本沒有機器保護。
編輯:@Oli查爾斯沃斯的答案比我的好。
值得一提的是,智能編譯器在優化階段也可以使用這些信息。 – 2010-10-28 11:07:20
在C++中,const
,很少有什麼做硬件。這主要是告訴編譯器某種訪問會導致編譯器錯誤的一種方法。
唯一的例外是基本或POD類型的靜態常量變量,它們通常鏈接到可執行映像中的只讀部分,如果拋棄常量並嘗試去執行,會觸發某種頁面錯誤修改其中之一。
「const」並不一定意味着存儲是隻讀的。它是一個聲明,C++程序不會改變它(因此編譯器應該拒絕任何嘗試)。這並不意味着價值不會改變。
這是相當合理的一個變量是「const volatile的」(該計劃不會改變它,但它可能在任何時候改變)。例如,只讀硬件端口可能就是這樣一個野獸。
所以在「較低級別的機器」,沒有什麼需要做的事情。內存是什麼,應用程序員需要正確聲明內容。
大多數情況下,什麼都沒有。 – 2010-10-28 11:01:13