C++ string::size\u类型而不是int
为什么C++ string::size\u类型而不是int,c++,string,int,size-type,C++,String,Int,Size Type,为什么string::size\u typeint应该可以工作!它有数字 短码也能容纳数字。签名字符也是如此 但是这些类型都不能保证足够大来表示任何字符串的大小 string::size\u type保证了这一点。它是一种大到足以表示字符串大小的类型,无论该字符串有多大 一个简单的例子说明为什么这是必要的,考虑64位平台。int通常仍然是32位,但内存远远超过2^32字节 因此,如果使用(签名)int,则无法创建大于2^31个字符的字符串。 然而,在这些平台上,size_类型将是64位的值,因此
string::size\u type
int
应该可以工作!它有数字 短码也能容纳数字。签名字符也是如此
但是这些类型都不能保证足够大来表示任何字符串的大小
string::size\u type
保证了这一点。它是一种大到足以表示字符串大小的类型,无论该字符串有多大
一个简单的例子说明为什么这是必要的,考虑64位平台。int通常仍然是32位,但内存远远超过2^32字节
因此,如果使用(签名)int,则无法创建大于2^31个字符的字符串。然而,在这些平台上,size_类型将是64位的值,因此它可以毫无问题地表示更大的字符串。嵌套的
size_类型
typedef是STL兼容容器的一个要求(它正好是std::string
),因此通用代码可以选择正确的整数类型来表示大小
在应用程序代码中使用它没有任何意义,
size\u t
是完全可以的(int
不是,因为它是有符号的,您将得到有符号/无符号的比较警告)。您给出的示例
const std::string::size_type cols = greeting.size() + pad * 2 + 2;
是从哪里来的。他还说明了他选择的原因,即:
string类型将size_类型定义为
用于保存字符串中字符数的适当类型。每当我们需要一个本地的
变量要包含字符串的大小,我们应该使用std::string::size\u type作为该变量的类型
我们给cols一个std::string::size\u类型的原因是
确保cols能够包含字符数
在问候语中,不管这个数字有多大。我们可以简单地
已经说过cols有int类型,实际上,这样做可能会
工作但是,cols的值取决于输入的大小
我们无法控制输入的时间。
可以想象,有人会给我们的程序一个这么长的字符串
int不足以包含其长度
PowerPC和Cell上也是如此。据我所知,阿尔法也是如此。另外,当然,我认为x64是当今典型的64位CPU但你是对的,它显然是依赖于平台的。我们在这里谈论的是哪个64位Linux平台?在x64机器上,我上次尝试时它仍然有32位整数。在单元处理器上,int也是32位。进一步说,我假设同样的情况也适用于PowerPC上的Linux。所以不,Linux ABI因平台而异,我所知道的大多数平台都指定4位整数,即使在Linux上也是如此。但你是对的。硬件通常定义一个通用ABI,软件应遵循该ABI以实现互操作性。操作系统定义的ABI通常相同,但可能不同。编译器实际上实现了一个ABI,它通常也遵循操作系统,但严格来说并不一定要遵循。而且是独立于机器的。有人会说没有意义吗?如果您不想要最可移植的代码,那么可以使用
size\u t
。或者对于今天的大多数实际情况,您可以使用size\u t
。但是如果没有意义,size\u type
就不存在了,是吗?size\u t
保证足够大,所以最多只能“浪费”一些空间(在寄存器或堆栈中)来使用大于必要的值。这些typedef用于泛型代码,而不是在使用具体模型std::string
时使用。也就是说,如果在模板函数中使用任意basic_字符串
,特别是使用任意分配器,则应使用嵌套的typedef。但是是的,std::string
没有意义,因为size\u t
是完全可以的。size\u t
是无符号的。只要与std::string::npos
(而不是pos>=0
)进行比较,就应该可以了。
const std::string::size_type cols = greeting.size() + pad * 2 + 2;