我看到用這種類型定義的變量,但我不知道它來自哪裏,也沒有它的目的。爲什麼不使用int或unsigned int? (關於其他「類似」類型呢?Void_t等)。我在哪裏可以找到size_t的定義?
回答
這樣你總是知道尺寸是什麼,因爲一個特定的類型是專門用於尺寸。自己的問題表明它可能是一個問題:是int
還是unsigned int
?另外,什麼是數量級(short
,int
,long
等)?
因爲有一個特定的類型分配,你不必擔心長度或簽名。
實際的定義可以在C++ Reference Library中找到,它說:
類型:
size_t
(無符號整型)部首:
<cstring>
size_t
對應於返回的積分數據類型由語言運算符sizeof
定義,並在<cstring>
頭文件(等等)中定義爲無符號整型。在
<cstring>
,它在功能memchr
,memcmp
,memcpy
,memmove
,memset
,strncat
,strncmp
,strncpy
和strxfrm
,其在所有情況下它是用來指定的最大數量被用作參數num
的類型該函數必須影響的字節或字符。它也被用作返回類型
strcspn
,strlen
,strspn
和strxfrm
返回大小和長度。
size_t應該在標準庫的頭文件中定義。根據我的經驗,它通常只是一個unsigned int的typedef。但是,這一點不是必須的。 像size_t這樣的類型允許標準庫供應商可以自由更改其底層數據類型(如果適用於該平臺的話)。如果您認爲size_t始終是unsigned int(通過強制轉換等),那麼如果您的供應商將size_t更改爲例如,您可能會遇到問題。一個64位的類型。由於這個原因,對這個或任何其他庫類型進行假設是很危險的。
size_t
是無符號整數類型sizeof操作符的結果(ISO C99第7.17。)
的sizeof
操作者產生其操作數的大小(以字節爲單位),其可以是 表達或一個類型的加括號的名字。大小由操作數的類型 決定。結果是一個整數。結果的值是實現代網絡定義,和 其類型(無符號整數類型)是size_t
(ISO C99第6.5.3.4。)
實事求是地講size_t
代表你可以解決的字節數。在過去的10 - 15年中,大多數現代體系結構都是32位,這也是無符號整數的大小。然而,我們正在轉向64位尋址,而uint
很可能會保持在32位(它的大小在C++標準中是不能保證的)。爲了使你的代碼依賴於跨體系結構的可移植內存,你應該使用size_t
。例如,數組大小應始終使用size_t
's。如果您查看標準容器,::size()
總是會返回size_t
。
另請注意,Visual Studio有一個編譯選項,可以檢查這些類型的錯誤稱爲「檢測64位可移植性問題」。
我對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
,該代碼想必會更容易移植到不同的平臺。
根據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>
在一個size_t
定義是不是「偶然」裝簡約方案,一些包括但我仍然需要它在某些情況下(例如訪問std::vector<double>
),然後我用即上下文來提取正確的類型。例如typedef std::vector<double>::size_type size_t
。
(環繞聲與namespace {...}
如果必要的話,使空間有限。)
至於「爲什麼不使用int或unsigned int?」,只是因爲這是語義上更有意義都不到。有一個實際的原因,它可以是typedef
d作爲int
,然後升級到long
,當然沒有任何人需要改變他們的代碼,但是更重要的是比一個類型應該是有意義的。爲了大大簡化,size_t
類型的變量適用於並用於包含事物的大小,就像time_t
適合包含時間值一樣。如何實現這些實際應該是實現的工作。與僅僅調用所有內容int
相比,使用像這樣有意義的類型名稱有助於澄清程序的含義和意圖,就像任何豐富的類型一樣。
- 1. 哪裏可以找到CeCreateDatabaseWithProps的定義
- 2. 哪裏可以找到Theme_Material_Light的定義?
- 3. 我在哪裏可以找到spatstat中類對象的定義
- 4. 我在哪裏可以找到scala.Any和scala.AnyRef的定義?
- 5. 什麼是__dirstream,我們在哪裏可以找到的定義
- 6. 我在哪裏可以找到「eslint:recommended」的規則定義?
- 7. 我在哪裏可以找到?android:attr/listItemFirstLineStyle的定義
- 8. 我在哪裏可以找到elasticsearch DSL的正式定義?
- 9. 我在哪裏可以找到jsf的模式定義?
- 10. 我在哪裏可以找到PDFMiner API定義?
- 11. 我在哪裏可以找到cpanfile格式定義?
- 12. EDI X12標準 - 我在哪裏可以找到這個定義?
- 13. 我在哪裏可以找到「自定義開/關」選項?
- 14. 我在哪裏可以找到Alfresco 4表單定義?
- 15. 我在哪裏可以找到Xcode術語和定義?
- 16. 在哪裏可以找到我的DB2
- 17. 我在哪裏可以找到的UIKit
- 18. 哪裏可以找到我需要的Symfony2自定義參數?
- 19. 我在哪裏可以找到IVCWizCtlUI
- 20. 我在哪裏可以找到gtkmm/overlay.h?
- 21. 我在哪裏可以找到ExpressionParseHelper?
- 22. 我在哪裏可以找到ContactsListActivity?
- 23. 我在哪裏可以找到PyBluez API
- 24. 我在哪裏可以找到Psychtoolbox-3.0.11?
- 25. 我在哪裏可以找到System.ComponentModel.Composition.Initialization.dll?
- 26. 我在哪裏可以找到sharepoint api
- 27. 我在哪裏可以找到PHPUnit_Extensions_SeleniumTestCase?
- 28. 我在哪裏可以找到System.Linq.Dynamic dll?
- 29. 我在哪裏可以找到$腳本?
- 30. 我在哪裏可以找到tomesh.c?
精確的問題:這很奇怪,搜索術語'size_t'是一個奇怪的問題:http://stackoverflow.com/questions/502856/whats-the-difference-between-sizet-and-int-in-c – kjfletch 2009-07-13 13:23:46
@kjfletch:hhhmmm, (就像我之前所做的那樣)並沒有回到這個問題。 – 2009-07-13 13:40:10
@Eliseo Ocampos,當你提出你的問題主題時,它沒有出現?很奇怪。希望你得到你的答案。 – kjfletch 2009-07-13 13:42:36