size_t
类型是一个实现定义的无符号整数类型,足够大以包含任何对象的字节大小。" 这可能与“字大小”相同,不管这意味着什么。size_t
不一定是指针的大小。虽然通常情况下是这样,但在一个32位分段x86模型中,指针大小为48位,但一个“对象”仍然只能是32位,因此 size_t
将是一个32位的值。 - Mats Peterssonsize_t
并不一定是您所谓的运行代码的机器(在交叉编译的情况下)或编译代码的机器(在正常情况下,代码将在与编译代码相同类型的机器上运行)的“字大小”。它是一个无符号整数类型,足够大以容纳实现可以分配的最大对象的大小(以字节为单位)。
sizeof
和size_t
的历史我不知道确切的size_t
引入时间,但在1979年至1989年之间。K&R《C语言程序设计》第1版于1978年没有提到size_t
。Unix程序员手册第7版从1979年起完全没有提到size_t
。Kernighan和Pike的书《UNIX编程环境》于1984年在索引中没有提到size_t
(也没有出乎我的意料地提到malloc()
或free()
),但这只是指示性的,而不是决定性的。C89标准当然有size_t
。
C99理由文件记录了一些关于sizeof()
和size_t
的信息:
<stddef.h>
是由C89委员会发明的。我没有找到说明size_t
也是由C89委员会发明的文字,但如果不是的话,它应该是对C中最近发展的一种编码。
size_t
的大小是否与编译代码的机器的字长有关。如果你在 64 位机器上进行 8 位或 16 位微处理器的交叉编译,那么程序中 size_t
的大小很可能与编译机器上的字长毫不相干 — 这就是我提到交叉编译的原因。 - Jonathan Leffler<stddef.h>
头文件定义了一个类型'_size_t
,它是sizeof
运算符结果的无符号整数类型'。 C99将'integral'更改为'integer',而C11与C99相同。 - Jonathan Lefflersizeof
运算符的解释并不是很详细;它说:'sizeof
的结果值是由实现定义的,其类型(一个无符号整数类型)是在 <stddef.h>
(和其他头文件)中定义的 size_t
。' - Jonathan Lefflersize_t
定义为“sizeof
运算符结果的无符号整数类型”。换句话说,size_t
必须足够大,以容纳由sizeof
产生的任何表达式的大小。这可能是机器字长,但它也可能小得惊人(例如,如果编译器限制了数组或对象的最大大小),或者大得惊人(如果编译器允许您创建如此巨大的对象,以至于单个机器字无法存储该对象的大小)。希望这有所帮助!size_t
是由我的编译器实现设置的?由于我可以分配的最大内存量明显受到物理内存的限制,那么size_t
是否受到我可供地址空间使用的物理内存量的限制呢? - gonesize_t
足够大,以容纳任意两个物理地址之间的差异(对象的结束地址和起始地址的差异给出了其大小)。另一方面,你可以想象一个奇怪的设置,其中有一个128位的地址空间,但是分配器不能分配超过4GB的内存,在这种情况下,机器可以使用32位整数作为size_t
。唯一的方法就是查看编译器文档。 - templatetypedefmalloc
(C)和operator new
(C ++)的参数类型为size_t
,因此如果您尝试传递较大的值,则数字将溢出。 - templatetypedefsize_t最初只是在sys/types.h中的typedef(传统上在Unix / Linux上)。它被认为足够大,例如,对于文件的最大大小或使用malloc进行的最大分配。然而,随着时间的推移,标准委员会掌握了它,因此它被复制到许多不同的头文件中,并每次使用自己的#ifdef保护来防止多重定义。另一方面,具有非常大潜在文件大小的64位系统的出现使其角色变得有些模糊。因此,它有点像古文物。
现在的语言标准将其列为存储在stddef.h中。它与硬件字长没有必要的关系,也没有编译器魔法。请参阅其他答案,了解这些标准对其大小的规定。
stddef.h
中,是标准中的内容,不特定于任何平台。 - Rapptz<stddef.h>
、<string.h>
、<stdio.h>
和<stdlib.h>
,类型size_t
将被定义。 - Jonathan Leffler<sys/types.h>
来定义 size_t
,因为这样会暴露太多其他保留给用户的符号。 - Jonathan Leffler这些定义都是实现定义的。如果我需要最佳猜测大小,我会使用sizeof(char *)或者sizeof(void *)。这样做能够给出软件使用的表面字长...但硬件实际上可能不同(例如,32位系统可能通过软件支持64位整数)。
此外,如果您是C语言的新手,请查看stdint.h以获取有关整数大小的各种材料。
尽管定义并没有直接说明size_t
是什么类型,也没有要求最小大小,但它间接地给出了一些好的提示。一个size_t
必须能够包含任何对象的字节大小,换句话说,它必须能够包含可能的最大对象的大小。
可能的最大对象是一个大小等于整个可用地址空间的数组(或结构)。无法以有意义的方式引用一个更大的对象,除了交换空间的可用性外,没有理由需要它变得更小。
因此,根据定义的措辞,在32位架构上,size_t
必须至少为32位,在64位系统上,size_t
必须至少为64位。当然,实现可以选择更大的size_t
,但这通常不是这种情况。
size_t
的最小最大值为65535。 - icktoofaybad_alloc
,但这与不支持该类型并不相同。 - Damon
size_t
类型,这是您在编写C或C++代码时能够假定的全部内容。 - Nemosize_t
往往是机器的字长。(而且“往往”字面上意思是:几乎所有情况下——也就是说,我从来没有听说过任何一个不是这样的环境。) - Mysticial