簡體   English   中英

為什么int的size_t足以滿足數組的大小?

[英]Why size_t when int would suffice for the size of an array?

C標准保證int能夠存儲所有可能的數組大小。 至少,我從閱讀第6.5.2.1節第1節(數組下標約束)中了解到:

其中一個表達式的類型應為“指向對象類型的指針”,另一個表達式的類型應為整數,結果的類型為“ type”。

由於我們將int用作數組下標,為什么我們應該使用size_t來確定數組的大小?

為什么int足夠時strlen()返回size_t

術語“整數類型”並不表示int -例如, charshort是整數類型。

僅僅因為您可以使用int對數組下標並不意味着它可以到達所有可能的數組元素。

更具體地說,關於size_tint例子是平台,其中int可能是16位類型,而size_t可能是32位類型(或者更常見的32位int與64位size_t區別是當今的64位平台)。

整數類型不一定是“ int”。 “ long long”和“ size_t”也是整數類型。

陣列可以大於2GB。 對於那些編寫內存占用程序的人來說,此屬性非常方便,例如具有大緩沖池的DBMS,具有大內存緩存的應用服務器等。大於2GB / 4GB的數組是64位計算的全部要點:)

size_t對於strlen(),至少聽起來與C標准如何處理數組兼容,是否有意義,或者是否有人看到過這么大的字符串,這是另一個問題。

首先,您在標准中引用的內容沒有專門引用int類型。 不, int不能保證足以存儲C中任何對象(包括數組)的大小。

其次,C語言實際上並沒有專門的“數組訂閱”。 數組訂閱是通過指針算法實現的。 指針算術中的整數操作數具有ptrdiff_t類型。 不是size_t ,不是int ,而是ptrdiff_t 它是一個帶符號的類型BTW,表示該值可以為負。

第三, size_t的目的是存儲程序中任何對象的大小(即存儲sizeof的結果)。 它不立即打算用作數組索引。 它恰好可以用作數組索引,因為可以確保它始終足夠大以索引任何數組。 但是,從抽象的角度來看,“數組”是一種特定的“容器”,並且還有其他類型的容器(基於列表的容器,基於樹的容器等)。 在一般情況下, size_t不足以存儲任何容器的大小,在一般情況下,這也使其成為數組索引的可疑選擇。 (另一方面, strlen是專門用於數組的函數,這使得size_t在那里適用。)

編寫C標准時,機器通常具有16位的“ int”類型,並且不能處理大於65535字節的任何單個對象,但是仍然能夠處理大於32767字節的對象。 由於對無符號int進行算術運算將足以處理此類對象的最大大小,而對有符號int進行算術運算則無法做到,因此將size_t定義為無符號以便無需使用“長”計算即可容納此類對象。

在最大允許對象大小在INT_MAX和UINT_MAX之間的機器上,指向此類對象的開始和結束的指針之間的差異可能太大而無法放入“ int”。 盡管標准沒有對實現方式的處理方式提出任何要求,但是一種常見的方法是定義整數和指針的環繞行為,例如,如果S和E是指向char的開頭和結尾的指針,則[49152]即使ES超過INT_MAX,它也會產生一個值,當將其添加到S時,它將產生E。

如今,size_t是無符號類型這一事實幾乎沒有任何真正的好處(因為需要大於2GB的對象的代碼出於其他原因經常需要使用64位指針),並且它導致涉及對象大小的多種比較行為違反直覺,但是表達式的sizeof產生了一個無符號類型這一事實已經根深蒂固,以至於不可能改變。

size_t是無符號整數的typedef(例如int或long)。

在某些64位平台上,int可以為32位,而size_t可以為64位。

它用作更標准的尺寸方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM