我看到了使用此类型定义的变量,但我不知道它来自哪里,也不知道它的目的是什么。为什么不使用 int 或 unsigned int?(其他“相似”的类型如何?void_t等)。
来源:维基百科
stdlib.h
和stddef.h
头文件定义了一个叫做size_t
的数据类型1,用于表示对象的大小。使用该数据类型作为参数的库函数希望其是size_t
类型,并且sizeof
运算符所得到的结果也是size_t
类型。
size_t
的实际类型取决于平台;一个常见的错误是假定size_t
与无符号整数相同,这可能导致编程错误2,尤其是在64位架构变得更加普遍的情况下。
来源:C99 7.17.1/2
标准头文件
stddef.h
中定义了以下类型和宏<snip>
size_t
是
sizeof
运算符结果的无符号整数类型
int
和unsigned int
类型是32位的,而size_t
类型是64位的。 - Michael Burrsize_t
定义在以下头文件中:std::size_t
...
Defined in header <cstddef>
Defined in header <cstdio>
Defined in header <cstring>
Defined in header <ctime>
Defined in header <cwchar>
std::size_t
定义在头文件 <cstddef>
中,符合 ISO C++ 标准,并且被其他列出的头文件使用。 - fpmurphysize_t
是sizeof运算符(ISO C99第7.17节)结果的无符号整数类型。
sizeof
运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的括号名称。大小从操作数的类型确定。结果是一个整数。结果的值是实现定义的,其类型(一种无符号整数类型)为size_t
(ISO C99第6.5.3.4节)。
IEEE Std 1003.1-2017(POSIX.1)指定size_t
在头文件sys/types.h
中定义,而ISO C则指定头文件stddef.h
。在ISO C++中,类型std::size_t
在标准头文件cstddef
中定义。
size_t
表示您可以寻址的字节数。在过去的 10-15 年中,大多数现代架构都是 32 位,这也是无符号整数的大小。然而,我们正在向 64 位寻址转移,而 uint
很可能仍然保持在 32 位(它的大小在 C++ 标准中没有保证)。为了使依赖于内存大小的代码跨架构可移植,应该使用 size_t
。例如,像数组大小这样的东西应该始终使用 size_t
。如果查看标准容器,::size()
总是返回一个 size_t
。int
还是unsigned int
?此外,大小是多少(short
,int
,long
等)?size_t
(无符号整型)<cstring>
size_t
对应于语言运算符 sizeof
返回的整数数据类型,并在 <cstring>
头文件(以及其他头文件)中定义为无符号整型。<cstring>
中,它被用作函数 memchr
、memcmp
、memcpy
、memmove
、memset
、strncat
、strncmp
、strncpy
和 strxfrm
中参数 num
的类型,在所有这些情况下,它都被用来指定函数需要影响的最大字节数或字符数。strcspn
、strlen
、strspn
和 strxfrm
的返回类型,用于返回大小和长度。size_t 应该在标准库的头文件中定义。根据我的经验,它通常只是 unsigned int 的 typedef。但重点是,它不一定非得这样。 像 size_t 这样的类型允许标准库供应商在适合平台的情况下更改其底层数据类型。如果您通过强制转换等方式假设 size_t 始终是 unsigned int,那么如果您的供应商将 size_t 更改为例如 64 位类型,则未来可能会遇到问题。出于这个原因,假设任何关于此或任何其他库类型的事情都是危险的。
我对void_t
不太熟悉,只是通过谷歌搜索了解到它(它在AT&T研究中心的Kiem-Phong Vo编写的vmalloc
库中使用 - 我相信它也被用在其他库中)。
各种xxx_t typedef用于从特定的具体实现中抽象出类型,因为用于某些事物的具体类型可能因平台而异。例如:
Void_t
抽象出由vmalloc
库例程返回的指针类型,因为它是为在ANSI/ISO C之前编写的系统上工作而编写的,其中void
关键字可能不存在。至少我是这么猜的。wchar_t
抽象出用于宽字符的类型,因为在某些系统上,它将是16位类型,而在其他系统上,它将是32位类型。因此,如果您编写宽字符处理代码使用类型而不是例如<无符号短整型>,那么这段代码将更具可移植性,可以在各种平台上运行。
size_t
定义但我仍需要在某些上下文中使用它(例如访问std::vector<double>
),那么我会使用该上下文来提取正确的类型。例如:typedef std::vector<double>::size_type size_t
。(如果需要限制范围,请用namespace {...}
括起来。)
size_t
定义,但我仍然需要在某些上下文中使用它(例如访问std::vector<double>
),那么我会使用该上下文来提取正确的类型。例如,typedef std::vector<double>::size_type size_t
。 - alfC