在哪里可以找到 size_t 的定义?

我看到用这种类型定义的变量,但我不知道它来自哪里,也不知道它的目的是什么。为什么不使用 int 或 unsignedint?(其他“类似”类型呢?Void _ t 等)。

223009 次浏览

来自 维基百科

stdlib.hstddef.h头文件定义了一种名为 size_t1的数据类型,用于表示对象的大小。采用大小的库函数期望它们的类型为 size_t,而 sizeof 运算符的计算结果为 size_t

size_t的实际类型是依赖于平台的; 一个常见的错误是假定 size_t与 unsignedint 相同,这可能导致编程错误,尤其是在64位架构变得更加普遍的情况下。

来自 C997.17.1/2

下列类型和宏在标准头 stddef.h中定义

< 剪辑 >

size_t

它是 sizeof 运算符结果的无符号整数类型

通过这种方式,您总是知道大小是什么,因为特定的类型专用于大小。这个问题表明它可能是一个问题: 它是一个 int还是一个 unsigned int?还有,大小是多少(shortintlong等等) ?

因为分配了特定的类型,所以不必担心长度或有符号性。

实际的定义可以在 C + + 参考文献库中找到,它说:

类型: size_t(无符号整数类型)

标题: <cstring>

size_t对应于由语言运算符 sizeof返回的整数数据类型,并且在 <cstring>头文件(以及其他文件)中定义为无符号整数类型。

<cstring>中,它被用作函数 memchrmemcmpmemcpymemmovememsetstrncatstrncmpstrncpynum0中参数 num的类型,在所有情况下,它都被用来指定函数必须影响的最大字节或字符数。

它还用作 strcspnstrlenstrspnstrxfrm返回大小和长度的返回类型。

Size _ t 应该在标准库的头中定义。根据我的经验,它通常只是一个对无符号 int 的 typedef。但重点是,不一定非要这样。 像 size _ t 这样的类型允许标准库供应商在适合平台的情况下自由更改其基础数据类型。如果假设 size _ t 始终是无符号 int (通过强制转换等) ,那么将来如果供应商将 size _ t 更改为64位类型,则可能会遇到问题。由于这个原因,对此或任何其他库类型进行任何假设都是危险的。

size_t是 sizeof 运算符的结果的无符号整数类型(ISO C99 Section 7.17.)

sizeof运算符生成其操作数的大小(以字节为单位) ,操作数可以是表达式或类型的括号名称。大小由操作数的类型决定。结果是一个整数。结果的值是实现定义的,其类型(无符号整数类型)是 size_t(ISO C99 Section 6.5.3.4.)

IEEE Std 1003.1-2017(POSIX.1)指定在头 sys/types.h中定义 size_t,而 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

还要注意的是,Visual Studio 有一个编译选项,可以检查这些类型的错误,称为“检测64位可移植性问题”。

我对 void_t并不熟悉,除非是因为 Google 搜索的结果(它在 AT & T 研究中心的 Kiem-Phong Vo 的 vmalloc中使用过——我确信它在其他库中也使用过)。

各种 xxx _ t typedef 用于从特定的实现中抽象类型,因为用于某些事情的具体类型可能因平台而异。例如:

  • Size _ t 抽象了用于保存对象大小的类型,因为在某些系统中,这将是一个32位值,在其他系统中,它可能是16位或64位。
  • Void_t抽象了由 vmalloc库例程返回的指针类型,因为它被编写用于 ANSI/ISO C 之前可能不存在 void关键字的系统。至少我是这么想的。
  • wchar_t抽象了宽字符的类型,因为在某些系统上它将是16位类型,在其他系统上它将是32位类型。

因此,如果编写宽字符处理代码,使用 wchar_t类型而不是 unsigned short类型,那么该代码可能对各种平台更具可移植性。

根据 关于 en.cppreference.com 的 size _ t 描述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>

在极简主义的程序中,size_t定义在某些包含中没有被“偶然”加载,但是我仍然需要它在某些上下文中(例如访问 std::vector<double>) ,然后我使用 那个上下文来提取正确的类型。例如 typedef std::vector<double>::size_type size_t

(必要时用 namespace {...}包围,以限制范围。)

至于“为什么不使用 int 或 unsignedint?”仅仅是因为语义上更有意义。这里有一个实际的原因,它可以是,比如说,typedefd 作为一个 int,然后以后升级到 long,当然,没有任何人必须改变他们的代码,但更根本的是,一个类型应该是有意义的。为了极大地简化,size_t类型的变量适合并用于包含事物的大小,就像 time_t适合包含时间值一样。如何实际地实现这些应该是实现的工作。与只调用所有类型 int相比,使用这样的有意义的类型名有助于阐明程序的意义和意图,就像任何丰富的类型集所做的那样。