從我所做成boost
和libstdc++
的偷窺,圖書館通常利用std::size_t
和std::ssize_t
每當一個無符號/簽署指數的上/下限事先並不知道。我的問題是:爲什麼不寧願用<cstdint>
而不是std::size_t
和intmax_t
而不是std::ssize_t
來使用uintmax_t
?<cstdint> VS的std ::爲size_t類型
回答
的C++ 11標準(第8.12)表示:
(5)。
ptrdiff_t
類型是一個實現定義的有符號整數類型,它可以保存數組對象中兩個下標的差異....(6)。
size_t
類型是一種實現定義的無符號整數類型,其大小足以包含任何對象的字節大小。(7)。 [注意:建議實現選擇
ptrdiff_t
和size_t
的整數轉換等級(4.13)不大於signed long int
的類型,除非需要更大的大小來包含所有可能的值。 末端注]
由此我們看到:
size_t
是專門爲對象的字節大小,及其配套的ptrdiff_t
是專門用於數組的下標運算。另一方面,uintmax_t
是最大的無符號整數類型。根據平臺uintmax_t
可能大於size_t
。
我們也知道:
sizeof
返回size_t
和STL容器size_type
s爲通常等同於size_t
,因此是很有意義的代碼與sizeof
或STL容器涉及使用size_t
。
現在混合在一起的事實,<cstdint>
是C++的新奇,我認爲這很清楚爲什麼建立的庫像Boost一直在使用size_t
。
但是如果'uintmax_t'大於'size_t',那麼它可以包含一個更大的對象的大小,而不是'size_t'可以。 – user1095108
另外''boost''實現它自己的'
@ user1095108標準說'size_t'可以包含最大可能類型的大小。所以如果一個值不適合'size_t',它不是一個對象的大小。 –
前者是C++標準的一部分,後者則不是。更確切地說,cstdint
標頭最近才引入(在C++ 11中)。原因是stdint.h
本身是C99的一部分,它比C++ 98更新。
此外,'size_t'更具描述性,可以比'uintmax_t'小。 – Deduplicator
你似乎忘記了'size_t'也是'C'標準的一部分,但'C'庫也更喜歡使用'size_t'到'uintmax_t'。 – user1095108
正如我所說的stdint.h是C99,你也可以使用相同的C庫來編譯C89。 – ypnos
因爲size_t類型旨在描述事物的大小。使用它們的尺寸比uint_t更具描述性。
另外,體系結構可能會被限制爲小尺寸的東西,所以size_t可能並不總是最大的整數類型。雖然我認爲這有點奇怪。
只要平臺位數小於64位,或者存在擴展範圍整數,'size_t'不是最大的整數類型。 – Deduplicator
特別是,size_t不是最大的整數類型,它是x86上的標準。 – hvd
@Deduplicator:我應該說最大的自然整數類型?我知道編譯器可以在32位系統上合成64位操作,但實際的機器指令是32位。 –
- 1. std :: size_t或std :: vector <Foo> :: size_type?
- 2. 爲size_t爲0x1 << 31比爲size_t爲0x1 << 30
- 3. 使用不同整數類型的std :: vector <size_t>總是安全嗎?
- 4. std :: vector <std :: vector <T>> vs std :: vector <T*>
- 5. 類型'std :: vector <Object*>&'&'&'
- 6. 安全的方式來否定一些類型std :: size_t
- 7. 在編譯時檢測的std ::爲size_t類型調用正確的函數
- 8. C++枚舉類的std ::爲size_t隱式轉換
- 9. std ::查找類型T ** vs T * [N]
- 10. 錯誤:'operator *'不匹配(操作數類型爲'std :: vector <std :: complex <double>>'和'std :: complex <double>')
- 11. boost :: ptr_vector vs. std :: vector <std :: unique_ptr <T>>?
- 12. 的std :: make_array <size_t>從符號整數
- 13. std :: set <std :: pair <size_t,std :: string>> :: find(),沒有字符串拷貝構造
- 14. 添加size_t類型值的指針
- 15. std :: variant vs std ::任何當類型是移動可構造
- 16. 點爲size_t
- 17. 如何將類型size_t的指針轉換爲枚舉指針?
- 18. C++ size_t和double類型的計算
- 19. 什麼類型減去2 size_t的?
- 20. C++:size_t是size_type的伴隨類型嗎?
- 21. 的std :: ENDL是未知類型的<<
- 22. 返回類型爲std :: search()
- 23. C++如何設置類型性病的指針:: vector的<Derived*>類型爲std反對:: vector的<Base*>
- 24. 只爲某些std啓用模板::向量<T2>類型
- 25. std :: make_unique <T> vs reset(new T)
- 26. 警告:格式'%d'期望類型'int',但參數4的類型爲'size_t'
- 27. 用MPI發送size_t類型數據
- 28. 使用`size_t`作爲計數器的類型
- 29. 爲什麼在64位Windows 7中size_t的類型是uint?
- 30. 爲什麼size_t類型的函數參數?
我不認爲'std :: ssize_t'存在。 POSIX定義了'ssize_t',但它不是C++標準的一部分。 C++使用'std :: size_t'和'std :: ptrdiff_t'。 –
@CrisLuengo我想我嘗試過使用'std :: ssize_t'一次,它工作。當然這是編譯器特定的。 – user1095108