我看到用这种类型定义的变量,但我不知道它来自何处,也不知道它的目的是什么。为什么不使用int或unsigned int? (其他“类似”类型怎么样?Void_t等。)
答案 0 :(得分:111)
stdlib.h
和stddef.h
头文件定义了一个名为size_t
1的数据类型,用于表示对象的大小。采用大小的库函数期望它们的类型为size_t
,而sizeof运算符的计算结果为size_t
。
size_t
的实际类型取决于平台;一个常见的错误是假设size_t
与unsigned int相同,这可能导致编程错误2,特别是当64位架构变得更加普遍时。
标准标题
中定义了以下类型和宏stddef.h
<剪断>
size_t
是sizeof运算符
的结果的无符号整数类型
答案 1 :(得分:24)
size_t
是sizeof运算符结果的无符号整数类型(ISO C99第7.17节。)
sizeof
运算符产生其操作数的大小(以字节为单位),可以是
表达式或类型的括号名称。大小由类型确定
操作数。结果是整数。结果的值是实现定义的,和
它的类型(无符号整数类型)是size_t
(ISO C99第6.5.3.4节)。
答案 2 :(得分:22)
根据size_t description on en.cppreference.com size_t
在以下标题中定义:
std::size_t
...
Defined in header <cstddef>
Defined in header <cstdio>
Defined in header <cstring>
Defined in header <ctime>
Defined in header <cwchar>
答案 3 :(得分:4)
实际上,size_t
表示您可以解决的字节数。在过去10到15年的大多数现代架构中,32位也是无符号整数的大小。但是我们正在转向64位寻址,而uint
最有可能保持在32位(在c ++标准中不保证它的大小)。要使您的代码依赖于跨体系结构可移植的内存大小,您应该使用size_t
。例如,数组大小之类的东西应该始终使用size_t
。如果您查看标准容器,::size()
始终会返回size_t
。
另请注意,visual studio有一个编译选项,可以检查这些类型的错误,称为“检测64位可移植性问题”。
答案 4 :(得分:2)
通过这种方式,您始终可以知道尺寸是多少,因为特定类型专用于尺寸。自己的问题表明它可能是一个问题:它是int
还是unsigned int
?此外,幅度是多少(short
,int
,long
等等?)
因为指定了特定类型,所以您不必担心长度或签名。
实际定义可以在C++ Reference Library中找到,其中包含:
键入:
size_t
(无符号整数类型)标题:
<cstring>
size_t
对应于语言运算符sizeof
返回的整数数据类型,并在<cstring>
头文件(以及其他文件)中定义为无符号整数类型。在
<cstring>
中,它在函数num
,memchr
,memcmp
,memcpy
中用作参数memmove
的类型,memset
,strncat
,strncmp
,strncpy
和strxfrm
,在所有情况下都用于指定函数的最大字节数或字符数影响。它还用作
strcspn
,strlen
,strspn
和strxfrm
的返回类型,以返回大小和长度。
答案 5 :(得分:2)
size_t应该在标准库的标题中定义。根据我的经验,它通常只是unsigned int的typedef。但重点是它不一定是这样。 像size_t这样的类型允许标准库供应商自由地更改其底层数据类型(如果适用于平台)。如果你假设size_t总是unsigned int(通过强制转换等),如果你的供应商将size_t改为例如,你可能会遇到问题。 64位类型。由于这个原因,假设有关此类或任何其他库类型的任何内容是危险的。
答案 6 :(得分:1)
我不熟悉void_t
,除非是谷歌搜索(它在a vmalloc
library by Kiem-Phong Vo at AT&T Research中使用 - 我确信它也在其他库中使用过。)
各种xxx_t typedef用于从特定的确定实现中抽象出类型,因为用于某些事物的具体类型可能因平台而异。例如:
Void_t
抽象vmalloc
库例程返回的指针类型,因为它被编写为在早于ANSI / ISO C的系统上工作,其中void
关键字可能不存在。至少那是我猜的。wchar_t
抽象出用于宽字符的类型,因为在某些系统上它将是16位类型,而在其他系统上它将是32位类型。因此,如果您编写广泛的字符处理代码以使用wchar_t
类型而不是unsigned short
,则该代码可能更容易移植到各种平台。
答案 7 :(得分:1)
在简约程序中,size_t
定义未在某些包含中“偶然”加载,但我仍然需要在某些上下文中(例如访问std::vector<double>
),然后我使用 上下文提取正确的类型。例如typedef std::vector<double>::size_type size_t
。
(如果需要,可以使namespace {...}
环绕以限制范围。)
答案 8 :(得分:1)
至于“为什么不使用int或unsigned int?”,只是因为它在语义上更有意义。有一个实际的原因,例如,它可以typedef
作为int
,然后升级到long
,当然,没有任何人必须更改其代码,但更根本的是比那种类型应该是有意义的。为了大大简化,size_t
类型的变量适用于包含事物大小的变量,并且用于包含事物的大小,就像time_t
适合包含时间值一样。如何实际实现这些应该是实现的工作。与仅调用所有int
相比,使用这样有意义的类型名称有助于澄清程序的含义和意图,就像任何丰富的类型集一样。