2009-07-25 63 views

回答

77

短暫持有號碼。像簽名字符一樣。

但是,這些類型都不能保證足夠大以代表任何字符串的大小。

string::size_type保證這一點。無論字符串有多大,它都是足夠大的類型來表示字符串的大小。

想了解爲什麼這是必要的一個簡單示例,請考慮64位平臺。一個int通常仍然是32位,但你有2^32字節以上的內存。

因此,如果使用(signed)int,您將無法創建大於2^31個字符的字符串。 size_type在這些平臺上將是一個64位值,因此它可以代表較大的字符串而不會出現問題。

+1

在PowerPC和Cell上也是如此。而且,據我所知,還有Alpha。另外,當然,我認爲現在x64是典型的64位CPU。 ;) 但是你是對的,它顯然是平臺依賴的。 – jalf 2009-07-25 18:58:49

+3

我們在這裏談論哪個64位Linux平臺?在x64機器上,最後我仍嘗試過32位整數。在Cell處理器上,int也是32位。另外,我假設在PowerPC上適用於Linux。所以不,Linux ABI因平臺而異,我知道的大多數平臺都指定4位整數,即使在Linux上也是如此。 – jalf 2009-07-26 22:30:46

7

嵌套size_type typedef是STL兼容容器(其中std::string恰巧)的要求,因此通用代碼可以選擇正確的整數類型來表示大小。

在應用程序代碼中使用它沒有意義,size_t完全可以(int不是,因爲它已簽名,並且會得到簽名/未簽名的比較警告)。

19

,你已經給出的例子,

const std::string::size_type cols = greeting.size() + pad * 2 + 2; 

Accelerated C++ by Koenig。他還說,他選擇的原因後,這​​一權利,即:

的的std :: string類型定義SIZE_TYPE是 適當類型的名稱保持字符串中的字符數。每當我們需要一個本地的 變量來包含一個字符串的大小時,我們應該使用std :: string :: size_type作爲該變量的類型。

,我們已經給出的cols一個類型的std :: string的原因:: size_type的是 保證的cols能夠包含字符 問候,數量不管這個數字可能會是多大的。我們可以簡單地說 曾經說過cols有int類型,事實上,這樣做可能會 工作。然而,cols的價值取決於我們程序的輸入大小,我們無法控制輸入的時間長短。 可以想象,有人可能會給我們的程序一個字符串很長的 int不足以包含它的長度。

相關問題