在64位系统上,
sizeof(unsigned long)
取决于系统实现的数据模型,例如LLP64(Windows)上为4字节,LP64(Linux等)上为8字节。 sizeof(size_t)
应该是什么? 它是否会像 sizeof(long)
那样随数据模型而变化? 如果是的话,怎么办?
参考资料:
size_t
由 C 标准定义为 sizeof
运算符的无符号整数返回类型(C99 6.3.5.4.4),以及 malloc
和朋友的参数(C99 7.20.3.3 等)。实际范围设置为最大值 (SIZE_MAX
) 至少为 65535 (C99 7.18.3.2)。
但是,这并不能让我们确定
sizeof(size_t)
。该实现可以自由地使用任何它喜欢的 size_t
表示形式 - 因此大小没有上限 - 并且该实现也可以自由地将字节定义为 16 位,在这种情况下 size_t
可以等效于 unsigned char
。
但是,抛开这一点,一般来说,无论数据模型如何,您在 32 位程序上都会有 32 位 size_t,在 64 位程序上会有 64 位 size_t。一般来说,数据模型只影响静态数据;例如,在海湾合作委员会:
`-mcmodel=small'
Generate code for the small code model: the program and its
symbols must be linked in the lower 2 GB of the address space.
Pointers are 64 bits. Programs can be statically or dynamically
linked. This is the default code model.
`-mcmodel=kernel'
Generate code for the kernel code model. The kernel runs in the
negative 2 GB of the address space. This model has to be used for
Linux kernel code.
`-mcmodel=medium'
Generate code for the medium model: The program is linked in the
lower 2 GB of the address space but symbols can be located
anywhere in the address space. Programs can be statically or
dynamically linked, but building of shared libraries are not
supported with the medium model.
`-mcmodel=large'
Generate code for the large model: This model makes no assumptions
about addresses and sizes of sections.
您会注意到,在所有情况下指针都是 64 位的;毕竟,拥有 64 位指针但没有 64 位大小没有什么意义。
它应该随着架构的不同而变化,因为它代表任何对象的大小。因此,在 32 位系统上,
size_t
可能至少为 32 位宽。在 64 位系统上,它可能至少为 64 位宽。
size_t 在 64 位机器上通常是 64 位
编辑:感谢您的评论 - 我在 C99 标准中查找了它,第 6.5.3.4 节中说:
结果值为 实现定义的及其类型 (无符号整数类型)是
, 定义于size_t
(以及其他 标题)<stddef.h>
因此,
size_t
的大小没有指定,只是它必须是无符号整数类型。然而,在标准的第 7.18.3 章中可以找到一个有趣的规范:
限制
size_t
SIZE_MAX 65535
这基本上意味着,无论
size_t
的大小如何,允许的值范围是 0-65535,其余的取决于实现。