2011-09-30 27 views
0

我有一個超過17,000 x 14,000的矩陣,我將其存儲在C++中的內存中。值永遠不會超過255,所以我想我應該將此矩陣存儲爲uint8_t類型而不是常規的int類型。即使使用優化編譯器,常規int類型是否會採用本地字長(64位,因此每個單元8字節)?我假設如果將數組存儲爲uint8_t,我會使用8倍的內存。對於大型矩陣uint8_t和unspecified int之間的區別

+0

感謝所有的答案,我意識到uint8_t可能會更慢,但是我的目標是在內存中支持更大的數組,然後我給出的例子。 –

+0

保存0 ... 255的常規類型是'unsigne d char'。這與'uint_least8_t'類型相似。由於'uint8_t'必須爲8位,因此編譯器可能需要插入額外的指令來主動截斷高於255的值。這顯然效率較低。 – MSalters

回答

2

該標準沒有指定確切尺寸int,除非它至少是short的尺寸。在一些64位體系結構上(例如,我使用的許多Linux和Solaris x86系統)int是32位,而long是64位。每種類型的確切大小當然會因編譯器/硬件而異。

要找出最好的方法是在您的系統上使用sizeof(int),看看它有多大。如果你有足夠的RAM使用本地類型,實際上可能會比uint8_t快得多。

+1

不是,'long'是32,'long long'在x86和amd64上都是64。 – wormsparty

+1

@wormsparty:在我的系統(x86_64 Linux Linux)上,'long'是64位。我非常確定Mark B對於「大多數」64位平臺是正確的。 – Nemo

+0

@wormsparty:你能澄清一下你的意思嗎?「long is 32 on ... amd64」?這不是真正的「架構」問題,因爲同一架構上有多個ABI,所以即使在同一個CPU上,操作系統也會有所不同。無論如何,你的一個例子不能與「大多數」64位體系結構具有特定屬性的說法相矛盾,64位Windows是Mark聲稱是少數的一員。 –

3

如果您懷疑這一點,您可以嘗試一下。

當然它會更小。

但是,它完全取決於您的使用模式,這將更快。簡介!簡介!簡介!

理由意想不到的性能方面的考慮:

  • 對齊問題
  • 要素共享高速緩存行(可能是在順序訪問陽性;在多核負的情況)
  • 需要增加對原子鎖的讀/寫(在線程的情況下)
  • 某些優化的MIPS指令的適用性降低(? - 我沒有及時瞭解細節;還有一個非常好的優化編譯器可能只要註冊分配從周圍的代碼
1

大小合適的臨時工)

  • 其他不相關的邊界條件,原產即使是最好的優化編譯器是不會做數據的值的分析認爲,你把你的矩陣和假設(擬人化在這裏)「嗯。他說int但一切都是從0到255我要作出這樣的uint8_t的數組。」

    編譯器可以解釋某些關鍵字,如registerinline的建議,而不是授權。類型,另一方面你告訴編譯器使用int所以編譯器必須使用int因此切換到uint8_t矩陣將爲你節省大量的內存

  • 相關問題