2009-07-13 61 views
94

我看到用這種類型定義的變量,但我不知道它來自哪裏,也沒有它的目的。爲什麼不使用int或unsigned int? (關於其他「類似」類型呢?Void_t等)。我在哪裏可以找到size_t的定義?

+0

精確的問題:這很奇怪,搜索術語'size_t'是一個奇怪的問題:http://stackoverflow.com/questions/502856/whats-the-difference-between-sizet-and-int-in-c – kjfletch 2009-07-13 13:23:46

+0

@kjfletch:hhhmmm, (就像我之前所做的那樣)並沒有回到這個問題。 – 2009-07-13 13:40:10

+0

@Eliseo Ocampos,當你提出你的問題主題時,它沒有出現?很奇怪。希望你得到你的答案。 – kjfletch 2009-07-13 13:42:36

回答

100

Wikipedia

stdlib.hstddef.h頭文件定義了一個名爲size_t1數據類型,其用於表示一個對象的大小。具有大小的庫函數期望它們的類型爲size_t,並且sizeof運算符的計算結果爲size_t

size_t的實際類型是平臺相關的;一個常見的錯誤是假定size_t與無符號整數相同,這可能導致編程錯誤,特別是在64位體系結構變得更普遍時,特別是2

C99 7.17.1/2

以下類型和宏在標準報頭中定義stddef.h

<剪斷>

size_t

其的無符號整數型t的結果他sizeof運營商

2

這樣你總是知道尺寸是什麼,因爲一個特定的類型是專門用於尺寸。自己的問題表明它可能是一個問題:是int還是unsigned int?另外,什麼是數量級(short,int,long等)?

因爲有一個特定的類型分配,你不必擔心長度或簽名。

實際的定義可以在C++ Reference Library中找到,它說:

類型:size_t(無符號整型)

部首:<cstring>

size_t對應於返回的積分數據類型由語言運算符sizeof定義,並在<cstring>頭文件(等等)中定義爲無符號整型。

<cstring>,它在功能memchrmemcmpmemcpymemmovememsetstrncatstrncmpstrncpystrxfrm,其在所有情況下它是用來指定的最大數量被用作參數num的類型該函數必須影響的字節或字符。

它也被用作返回類型strcspn,strlen,strspnstrxfrm返回大小和長度。

2

size_t應該在標準庫的頭文件中定義。根據我的經驗,它通常只是一個unsigned int的typedef。但是,這一點不是必須的。 像size_t這樣的類型允許標準庫供應商可以自由更改其底層數據類型(如果適用於該平臺的話)。如果您認爲size_t始終是unsigned int(通過強制轉換等),那麼如果您的供應商將size_t更改爲例如,您可能會遇到問題。一個64位的類型。由於這個原因,對這個或任何其他庫類型進行假設是很危險的。

21

size_t是無符號整數類型sizeof操作符的結果(ISO C99第7.17。)

sizeof操作者產生其操作數的大小(以字節爲單位),其可以是 表達或一個類型的加括號的名字。大小由操作數的類型 決定。結果是一個整數。結果的值是實現代網絡定義,和 其類型(無符號整數類型)是size_t(ISO C99第6.5.3.4。)

4

實事求是地講size_t代表你可以解決的字節數。在過去的10 - 15年中,大多數現代體系結構都是32位,這也是無符號整數的大小。然而,我們正在轉向64位尋址,而uint很可能會保持在32位(它的大小在C++標準中是不能保證的)。爲了使你的代碼依賴於跨體系結構的可移植內存,你應該使用size_t。例如,數組大小應始終使用size_t's。如果您查看標準容器,::size()總是會返回size_t

另請注意,Visual Studio有一個編譯選項,可以檢查這些類型的錯誤稱爲「檢測64位可移植性問題」。

1

我對void_t不熟悉,除非是Google搜索的結果(它在a vmalloc library by Kiem-Phong Vo at AT&T Research中使用 - 我確定它也用於其他庫)。

各種xxx_t類型定義用於從特定的確定實現中抽象類型,因爲用於某些事情的具體類型可能因平臺而異。例如:

  • size_t抽象出用於保存對象大小的類型,因爲在某些系統上這將是一個32位值,在其他系統上可能是16位或64位。
  • Void_t摘要vmalloc庫例程返回的指針類型,因爲它被寫入可在不存在void關鍵字的日期前ANSI/ISO C的系統上工作。至少這是我猜測的。
  • wchar_t摘要用於寬字符的類型,因爲在某些系統上它將是一個16位類型,而在其他系統上它將是一個32位類型。

所以,如果你寫你的寬字符處理代碼使用wchar_t類型,而不是,說unsigned short,該代碼想必會更容易移植到不同的平臺。

15

根據size_t description on en.cppreference.comsize_t在下面的頭文件中定義:

std::size_t 

...  

Defined in header <cstddef>   
Defined in header <cstdio>  
Defined in header <cstring>   
Defined in header <ctime>  
Defined in header <cwchar> 
1

在一個size_t定義是不是「偶然」裝簡約方案,一些包括但我仍然需要它在某些情況下(例如訪問std::vector<double>),然後我用上下文來提取正確的類型。例如typedef std::vector<double>::size_type size_t

(環繞聲與namespace {...}如果必要的話,使空間有限。)

1

至於「爲什麼不使用int或unsigned int?」,只是因爲這是語義上更有意義都不到。有一個實際的原因,它可以是typedefd作爲int,然後升級到long,當然沒有任何人需要改變他們的代碼,但是更重要的是比一個類型應該是有意義的。爲了大大簡化,size_t類型的變量適用於並用於包含事物的大小,就像time_t適合包含時間值一樣。如何實現這些實際應該是實現的工作。與僅僅調用所有內容int相比,使用像這樣有意義的類型名稱有助於澄清程序的含義和意圖,就像任何豐富的類型一樣。

相關問題