2010-10-14 98 views
6

stdint.h C99提供了整數大小,類型和範圍的許多選項 - 很多我不知道要選擇什麼!選擇最合適的整數大小/範圍用於變量

我知道how to use size_t and ptrdiff_t適當時,我使用固定大小類型的存儲和傳輸。我的問題涉及只存儲在主機內存中的值。

例如,對於圖像的結構可能會包含這些成員:

struct image { 
    integer width, height; /* pixel dimensions of the image */ 
    integer bits_per_pixel; 
    ... 
}; 

如果widthheight絕不會超過SHRT_MAX,應在short使用,或與int堅守?圖像不能有負寬度或高度,所以使用無符號類型?也許(u)int_least16_t是正確的選擇?還有別的嗎?

如果bits_per_pixel絕不會超過64個使用charunsigned charuint8_tint或別的東西的價值?

你會在這個例子中使用什麼?爲什麼?

代碼運行的CPU體系結構如何影響選擇?即PPC或x86,32或64位。
代碼將運行的設備如何影響選擇?即桌面,電話,控制檯。
選擇與性能和優化有什麼關係?

我簡單的問題是:你如何選擇使用哪個整數?

回答

4

我會說:不要太擔心這個,它往往是一種過早的優化形式。但我的經驗法則是:

  • 如果可能,請使用普通的int。它應該是機器的自然字大小。
  • 使用unsigned類型時,您需要定義明確的整數溢出。
  • 當您需要兩個補碼錶示法時,請使用(u)intX_t類型。
  • 對於值爲<= UCHAR_MAX的大型陣列,使用unsigned char

請注意,<stdint.h>中的很多類型都是可選的,因此您不能依賴它們的存在。 POSIX使這個稍微好一些。

1

沒有硬性規定。

如果您選擇的類型太小,最終可能會人爲地限制您的程序可以處理的數據集。太大了,你的表現可能會受到影響。

除非您遇到針對您的特定任務的性能問題,否則我肯定會傾向於「太大」。雖然使用一個整數來表示比特/像素是愚蠢的,但它可能不會損害任何更大的方案。

1

除非您的應用程序真的是內存密集型,否則不要擔心大小和使用int。使用short或char會導致稍後可能導致問題的細微錯誤。另外,使用char或short將無法獲得任何額外的CPU週期。

3

對於您的示例,我只需使用int或(可能更好)unsigned三個字段。除了包含數千或數百萬個元素的數組之外,使用更小的類型是沒有意義的;它只是施加了人爲限制。

要回答的更普遍的問題,下面是一些指導我去了:

  • 總是選擇你將存儲的值正確的符號性。
  • 對於對象計數,索引,內存中的字符串/數據的長度等,請使用size_t
  • 對於具有需要能夠存儲的特定值範圍的數據,以及不需要存儲超出範圍的值的數據,請使用stdint.huint8_tuint16_t)中的一個固定大小整數類型,uint32_t等)。想到這種需求的常見例子是像素值,音頻採樣和Unicode字符(通常分別爲8,16和32位)。
  • 否則,intunsigned可能是正確的使用類型。
+1

+1爲固定大小的數據示例。 – schot 2010-10-14 07:27:35

相關問題