我有一個超過17,000 x 14,000的矩陣,我將其存儲在C++中的內存中。值永遠不會超過255,所以我想我應該將此矩陣存儲爲uint8_t類型而不是常規的int類型。即使使用優化編譯器,常規int類型是否會採用本地字長(64位,因此每個單元8字節)?我假設如果將數組存儲爲uint8_t,我會使用8倍的內存。對於大型矩陣uint8_t和unspecified int之間的區別
回答
該標準沒有指定確切尺寸int
,除非它至少是short
的尺寸。在一些64位體系結構上(例如,我使用的許多Linux和Solaris x86系統)int
是32位,而long
是64位。每種類型的確切大小當然會因編譯器/硬件而異。
要找出最好的方法是在您的系統上使用sizeof(int)
,看看它有多大。如果你有足夠的RAM使用本地類型,實際上可能會比uint8_t
快得多。
不是,'long'是32,'long long'在x86和amd64上都是64。 – wormsparty
@wormsparty:在我的系統(x86_64 Linux Linux)上,'long'是64位。我非常確定Mark B對於「大多數」64位平臺是正確的。 – Nemo
@wormsparty:你能澄清一下你的意思嗎?「long is 32 on ... amd64」?這不是真正的「架構」問題,因爲同一架構上有多個ABI,所以即使在同一個CPU上,操作系統也會有所不同。無論如何,你的一個例子不能與「大多數」64位體系結構具有特定屬性的說法相矛盾,64位Windows是Mark聲稱是少數的一員。 –
如果您懷疑這一點,您可以嘗試一下。
當然它會更小。
但是,它完全取決於您的使用模式,這將更快。簡介!簡介!簡介!
理由意想不到的性能方面的考慮:
- 對齊問題
- 要素共享高速緩存行(可能是在順序訪問陽性;在多核負的情況)
- 需要增加對原子鎖的讀/寫(在線程的情況下)
- 某些優化的MIPS指令的適用性降低(? - 我沒有及時瞭解細節;還有一個非常好的優化編譯器可能只要註冊分配從周圍的代碼
大小合適的臨時工)
int
但一切都是從0到255我要作出這樣的uint8_t
的數組。」 編譯器可以解釋某些關鍵字,如register
和inline
的建議,而不是授權。類型,另一方面你告訴編譯器使用int
所以編譯器必須使用int
因此切換到uint8_t
矩陣將爲你節省大量的內存
- 1. 大小()和圖像矩陣rowsxcolumns之間的區別
- 2. int * x []和int(* x)[]之間的區別?
- 3. 在OpenCV矩陣和int矩陣之間的轉換
- 4. C#中char和int之間的區別#
- 5. int,NSInteger和NSUInteger之間的區別
- 6. uint和unsigned int之間的區別?
- 7. Python 3.5 - '//'和'int()'之間的區別
- 8. int和Integer之間的區別
- 9. Int和Uint8之間的區別swift
- 10. void main和int之間的區別主
- 11. defaultdict(lambda:None)和defaultdict(int)之間的區別
- 12. 對於大型矩陣,CUDA矩陣乘法中斷
- 13. int p = *(int *)i和int p = *(int *)&i之間的區別
- 14. 列表和矩陣之間的區別(Android)
- 15. 矩陣和動畫輪換之間的區別
- 16. 矩陣列和使用all_different之間的區別
- 17. 基本,基本和同形矩陣之間的區別
- 18. (int)和intval()之間有什麼區別?
- 19. 陣列和指針之間的區別
- 20. int someInts [3]和int * someInts = new int [3]之間的區別?
- 21. numpy矩陣和numpy.matrixlib.defmatrix.matrix之間有什麼區別?
- 22. PAM與Metis分區之間的區別
- 23. int [] []和int [,]之間的區別是什麼?
- 24. int32.Equals int的區別? == int?對於linq
- 25. 對稱矩陣與不對稱矩陣的區別
- 26. String.Sort和大於/小於運算符之間的區別VB.Net
- 27. 新的int和new(int)之間的C++有什麼區別?
- 28. '(int)a','a as int'和C#中的Convert.ToInt32(a)之間的區別
- 29. 傳遞(int x)和(const int x)之間的區別
- 30. $ GLOBALS和大寫$ var之間的區別
感謝所有的答案,我意識到uint8_t可能會更慢,但是我的目標是在內存中支持更大的數組,然後我給出的例子。 –
保存0 ... 255的常規類型是'unsigne d char'。這與'uint_least8_t'類型相似。由於'uint8_t'必須爲8位,因此編譯器可能需要插入額外的指令來主動截斷高於255的值。這顯然效率較低。 – MSalters