我總是喜歡使用最小尺寸的變量,它可以正常工作,但是如果我使用短字節整數而不是整數,並且內存爲32位字尋址,那麼這真的會給我帶來好處嗎?編譯器是否做了一些事情來增強內存使用情況 ?爲什麼使用小於32位的整數?
回答
對於局部變量,它可能沒有多大意義,但在具有數千乃至數百萬項目的結構中使用較小的整數時,可以節省大量的內存。
不,int
被選爲mopdern 32/64位體系結構中最快的int類型,使用較短的(short
,sbyte
)類型只會降低性能。
有時您可以保存在內存中,但只能在使用大型數組或列表時使用。即使如此,它通常不支付。
計算與8位:
sbyte a, b, c;
a = (sbyte) (b + c);
的類型轉換是必需的,攜帶一個運行時成本。
任何意見與反對票? – 2009-10-25 21:46:27
但是我們不在x86上運行(直接)。 C#爲每個計算增加了字節和短路。 – 2009-10-25 21:49:43
順便說一句,我沒有投票或投票你....我只是評論...但我猜downvote是你的答案是不完全正確的性能斷言。此外,您可以在不僅僅是陣列或列表中的結構上節省大量內存。例如,我們研究大型3D世界的遊戲,其中數十或數十萬個物體鬆散地連接在有向圖中(我們的遊戲之一加載大約200,000個物體)。對於性能和內存而言,可變大小確實很重要。 – Adisak 2009-10-25 21:51:35
如果它是一個普通變量,使用較短的寬度將不會獲得任何結果,並且某些性能可能會丟失。編譯器會自動將存儲器擴展爲一個完整的處理器字,因此即使只聲明16位,堆棧中也可能需要32位。另外,在某些情況下,編譯器可能需要執行某些截斷操作(例如,當該字段是結構的一部分時);這些可能會導致輕微的開銷。
它真的只對結構和數組很重要,即如果你有很多值。對於一個結構體,你可以節省一些內存,代價是上面提到的開銷。此外,如果結構需要遵循一些外部佈局,則可能會被迫使用較小的尺寸。對於陣列來說,如果陣列很大,節省存儲空間可能是相關的。
通常情況下,堅持int
等
除了其他的答案;還有一些情況是您故意只想支持給定的數據大小,因爲它代表了關於數據的一些關鍵事實。這與外部系統(特別是互操作性數據庫,文件格式等)交流時可能很關鍵,並可能與算術混合 - 儘早發現溢出。
說實話,內存消耗可能不是使用小整數(在這個例子中)的最有說服力的理由。但是有一個通用原則是說你應該只使用數據結構所需的內存。
原理是這樣的,只分配數據所需的寬度,讓編譯器找到可能發生的任何溢出錯誤,這是一種非常有效的額外調試技術。如果你知道一個值不應該超過一個閾值,那麼只能分配到該閾值。
- 1. 爲什麼要將兩個32位整數合併成一個64位整數?
- 2. 什麼類型用於大於2^32的整數?
- 3. 爲什麼int 32位?
- 4. 爲什麼Java整數中的整數不能使用全部32位或64位?
- 5. 用於32位python(3.6)的32位pyodbc適用於Microsoft的64位odbc驅動程序。爲什麼?
- 6. 使用PDO從64位轉換爲32位的整數
- 7. 在32位整數
- 8. 不受32或64位大小限制的Python整數的含義是什麼?
- 9. 該浮點數的小數部分的前32位是什麼?
- 10. 爲什麼我不能在ASM.js中使用32位ints數組?
- 11. 爲什麼angular.lowercase方法使用'按位或32'將'A'轉換爲'a'?爲什麼不使用'+ 32'?
- 12. 爲什麼64位程序文件大於32位?
- 13. 爲什麼32位等於4Giga字節而不是4吉位
- 14. 爲什麼所有32位整數的數組都需要4 GB?
- 15. 轉換爲32位整數24位整數(2S補碼)在C++
- 16. 如何設置_id爲32位整數?
- 17. 爲什麼__sync_add_and_fetch適用於32位系統上的64位變量?
- 18. 在C++中用於大於2^32的整數的類型是什麼?
- 19. 32位整型
- 20. 爲什麼打算32位尋址
- 21. 什麼會導致WM_NCHITTEST lParam溢出一個32位整數?
- 22. 反向32位整數
- 23. minSdkVersion正32位整數
- 24. MIPS 32位隨機整數
- 25. 什麼是適合32位和64位「32位」的術語
- 26. 將64位整數中的每一位比較爲一個32位整數
- 27. 將實數值轉換爲大於32位的整數值的最佳方法是什麼?
- 28. 算法使用32位無符號整數乘64位數
- 29. 使用64位整數迭代器的32位地址空間?
- 30. 64位整數在JVM中的效率低於32位整數嗎?
FWIW,在32位模式的PC上,16位整型實際上可能比32位整型稍慢,因爲機器操作碼實際上需要額外的字節來指定它們使用16位操作數。因此,對於本地變量,如果它適用於您,則使用本地int類型。同樣,對於結構,爲了節省內存,可以使用最小尺寸的工作。您可能希望按照相同的大小對成員變量進行分組,但不要因爲不同大小的成員變量之間的填充而浪費空間。 – Adisak 2009-10-25 21:19:45
順便說一句,這裏有一篇名爲'掌握C#中的結構'的文章,深入描述*完全*我在談論如何分組類似的變量:http://www.vsj.co.uk/articles/display.asp?id= 501 – Adisak 2009-10-25 21:23:51
我喜歡鏈接,非常翔實的 ,我想知道,我將如何獲得與數組類似的收益,它會像結構? – 2009-10-25 23:28:08