string :: size_type而不是int

问题描述:

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

为什么string::size_typeint应该工作!它拥有数字!string :: size_type而不是int

短暂持有号码。像签名字符一样。

但是,这些类型都不能保证足够大以代表任何字符串的大小。

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

嵌套size_type typedef是STL兼容容器(其中std::string恰巧)的要求,因此通用代码可以选择正确的整数类型来表示大小。

在应用程序代码中使用它没有意义,size_t完全可以(int不是,因为它已签名,并且会得到签名/未签名的比较警告)。

,你已经给出的例子,

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不足以包含它的长度。