2014-05-14 13 views
3

從我所做成boostlibstdc++的偷窺,圖書館通常利用std::size_tstd::ssize_t每當一個無符號/簽署指數的上/下限事先並不知道。我的問題是:爲什麼不寧願用<cstdint>而不是std::size_tintmax_t而不是std::ssize_t來使用uintmax_t<cstdint> VS的std ::爲size_t類型

+0

我不認爲'std :: ssize_t'存在。 POSIX定義了'ssize_t',但它不是C++標準的一部分。 C++使用'std :: size_t'和'std :: ptrdiff_t'。 –

+0

@CrisLuengo我想我嘗試過使用'std :: ssize_t'一次,它工作。當然這是編譯器特定的。 – user1095108

回答

2

的C++ 11標準(第8.12)表示:

(5)。 ptrdiff_t類型是一個實現定義的有符號整數類型,它可以保存數組對象中兩個下標的差異....

(6)。 size_t類型是一種實現定義的無符號整數類型,其大小足以包含任何對象的字節大小。

(7)。 [注意:建議實現選擇ptrdiff_tsize_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

+0

但是如果'uintmax_t'大於'size_t',那麼它可以包含一個更大的對象的大小,而不是'size_t'可以。 – user1095108

+0

另外''boost''實現它自己的'',作爲'cstdint.hpp',請查看http://www.boost.org/doc/libs/1_55_0/boost/cstdint.hpp – user1095108

+2

@ user1095108標準說'size_t'可以包含最大可能類型的大小。所以如果一個值不適合'size_t',它不是一個對象的大小。 –

3

前者是C++標準的一部分,後者則不是。更確切地說,cstdint標頭最近才引入(在C++ 11中)。原因是stdint.h本身是C99的一部分,它比C++ 98更新。

+0

此外,'size_t'更具描述性,可以比'uintmax_t'小。 – Deduplicator

+0

你似乎忘記了'size_t'也是'C'標準的一部分,但'C'庫也更喜歡使用'size_t'到'uintmax_t'。 – user1095108

+0

正如我所說的stdint.h是C99,你也可以使用相同的C庫來編譯C89。 – ypnos

2

因爲size_t類型旨在描述事物的大小。使用它們的尺寸比uint_t更具描述性。

另外,體系結構可能會被限制爲小尺寸的東西,所以size_t可能並不總是最大的整數類型。雖然我認爲這有點奇怪。

+0

只要平臺位數小於64位,或者存在擴展範圍整數,'size_t'不是最大的整數類型。 – Deduplicator

+0

特別是,size_t不是最大的整數類型,它是x86上的標準。 – hvd

+0

@Deduplicator:我應該說最大的自然整數類型?我知道編譯器可以在32位系統上合成64位操作,但實際的機器指令是32位。 –

相關問題