在我的代碼設計中,我包含了很多常量。當創建一個新對象時,是爲該對象的常量分配的內存,還是永久存儲在一個實例中,就像一個靜態變量是?在內存存儲方面,靜態項目到底在哪裏?每個對象是否爲常量分配內存?
換句話說,如果我定義了100個對象,會有100個同樣的常量值的副本嗎?
如果它們被定義在靜態存儲器中(無論那是什麼),並且我預料它們會訪問它們是否需要計算機切換內存頁?是否有不斷訪問常量而不是變量的性能問題?
感謝
戰神
在我的代碼設計中,我包含了很多常量。當創建一個新對象時,是爲該對象的常量分配的內存,還是永久存儲在一個實例中,就像一個靜態變量是?在內存存儲方面,靜態項目到底在哪裏?每個對象是否爲常量分配內存?
換句話說,如果我定義了100個對象,會有100個同樣的常量值的副本嗎?
如果它們被定義在靜態存儲器中(無論那是什麼),並且我預料它們會訪問它們是否需要計算機切換內存頁?是否有不斷訪問常量而不是變量的性能問題?
感謝
戰神
常量必須在運行時沒有任何存儲位置。對代碼進行編譯時,對常量標識符的所有訪問都會導致該常量的字面值取代標識符。
按照MSDN article:它產生
事實上,當編譯器遇到在C#源代碼的恆定標識符...,它直接代入文字值成中間語言(IL)代碼。
因此,使用恆定的,是這樣的:
const int myConst = 5;
int x = myConst;
是字面上(原諒雙關語)不超過下面的代碼不同:
int x = 5;
編譯器將產生相同的輸出無論哪種方式。運行程序集時,該值存儲在堆棧(執行方法的本地內存)中。無需查找,內存頁面切換,內存堆訪問或其他任何必需。
否,**常量字符串文字將具有對象引用實例化的字符串對象**。這被稱爲** string interning **,並由CLR應用以提高性能並減少保存具有相同字符序列的所有文字所需的內存空間。 –
@Mert但是常量標識符並不是持有任何數據的東西。語義與在整個代碼中簡單嵌入實際字符串文字相同。是的,如果啓用了interning,這恰好會導致字符串處於intern池中,並且對代碼中的這些文字的所有訪問都是使用對該字符串的硬編碼引用。從'const'語義學角度來看,這一切都是不相關的。沒有任何內存代表該常量標識符的存儲。 – Servy
如果您考慮問題,您的答案可能會被解釋爲錯誤,因爲如果所有字符串都是用** ldstr **命令推送的,那麼您將會遇到很大的性能下降和內存消耗。想想一個訪問一個常量字符串數百萬次的程序,如果我們每次都從元數據中加載字面量,這會是一個問題,對嗎? –