Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ string::size\u类型而不是int_C++_String_Int_Size Type - Fatal编程技术网

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;