2009-10-25 55 views
5

我總是喜歡使用最小尺寸的變量,它可以正常工作,但是如果我使用短字節整數而不是整數,並且內存爲32位字尋址,那麼這真的會給我帶來好處嗎?編譯器是否做了一些事情來增強內存使用情況 ?爲什麼使用小於32位的整數?

回答

11

對於局部變量,它可能沒有多大意義,但在具有數千乃至數百萬項目的結構中使用較小的整數時,可以節省大量的內存。

+1

FWIW,在32位模式的PC上,16位整型實際上可能比32位整型稍慢,因爲機器操作碼實際上需要額外的字節來指定它們使用16位操作數。因此,對於本地變量,如果它適用於您,則使用本地int類型。同樣,對於結構,爲了節省內存,可以使用最小尺寸的工作。您可能希望按照相同的大小對成員變量進行分組,但不要因爲不同大小的成員變量之間的填充而浪費空間。 – Adisak 2009-10-25 21:19:45

+1

順便說一句,這裏有一篇名爲'掌握C#中的結構'的文章,深入描述*完全*我在談論如何分組類似的變量:http://www.vsj.co.uk/articles/display.asp?id= 501 – Adisak 2009-10-25 21:23:51

+0

我喜歡鏈接,非常翔實的 ,我想知道,我將如何獲得與數組類似的收益,它會像結構? – 2009-10-25 23:28:08

4

不,int被選爲mopdern 32/64位體系結構中最快的int類型,使用較短的(short,sbyte)類型只會降低性能。

有時您可以保存在內存中,但只能在使用大型數組或列表時使用。即使如此,它通常不支付。

計算與8位:

sbyte a, b, c; 
a = (sbyte) (b + c); 

的類型轉換是必需的,攜帶一個運行時成本。

+0

任何意見與反對票? – 2009-10-25 21:46:27

+2

但是我們不在x86上運行(直接)。 C#爲每個計算增加了字節和短路。 – 2009-10-25 21:49:43

+0

順便說一句,我沒有投票或投票你....我只是評論...但我猜downvote是你的答案是不完全正確的性能斷言。此外,您可以在不僅僅是陣列或列表中的結構上節省大量內存。例如,我們研究大型3D世界的遊戲,其中數十或數十萬個物體鬆散地連接在有向圖中(我們的遊戲之一加載大約200,000個物體)。對於性能和內存而言,可變大小確實很重要。 – Adisak 2009-10-25 21:51:35

3

如果它是一個普通變量,使用較短的寬度將不會獲得任何結果,並且某些性能可能會丟失。編譯器會自動將存儲器擴展爲一個完整的處理器字,因此即使只聲明16位,堆棧中也可能需要32位。另外,在某些情況下,編譯器可能需要執行某些截斷操作(例如,當該字段是結構的一部分時);這些可能會導致輕微的開銷。

它真的只對結構和數組很重要,即如果你有很多值。對於一個結構體,你可以節省一些內存,代價是上面提到的開銷。此外,如果結構需要遵循一些外部佈局,則可能會被迫使用較小的尺寸。對於陣列來說,如果陣列很大,節省存儲空間可能是相關的。

3

通常情況下,堅持int

除了其他的答案;還有一些情況是您故意只想支持給定的數據大小,因爲它代表了關於數據的一些關鍵事實。這與外部系統(特別是互操作性數據庫,文件格式等)交流時可能很關鍵,並可能與算術混合 - 儘早發現溢出。

2

說實話,內存消耗可能不是使用小整數(在這個例子中)的最有說服力的理由。但是有一個通用原則是說你應該只使用數據結構所需的內存。

原理是這樣的,只分配數據所需的寬度,讓編譯器找到可能發生的任何溢出錯誤,這是一種非常有效的額外調試技術。如果你知道一個值不應該超過一個閾值,那麼只能分配到該閾值。

相關問題