c-32位和各种64位数据模型的sizeof(size_t)是多少?

在64位系统上,sizeof(unsigned long)取决于系统实现的数据模型,例如,在LLP64(Windows)上为4字节,在LP64(Linux等)上为8字节。 sizeof(size_t)应该是什么? 它是否像sizeof(long)一样随数据模型而变化? 如果是这样,怎么办?


参考文献:

维基百科上的64位数据模型

Kahler asked 2020-07-31T08:04:43Z
4个解决方案
53 votes

C标准将size_t定义为sizeof运算符的无符号整数返回类型(C99 6.3.5.4.4),以及malloc和friends的参数(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位。 通常,数据模型仅影响静态数据。 例如,在GCC中:

`-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位大小没有什么意义。

bdonlan answered 2020-07-31T08:18:20Z
10 votes

它应该随体系结构而变化,因为它表示任何对象的大小。 因此,在32位系统上,size_t的宽度可能至少为32位。 在64位系统上,该宽度可能至少为64位。

Evan Teran answered 2020-07-31T08:18:40Z
5 votes

在64位计算机上,size_t通常为64位

adwords answered 2020-07-31T08:19:00Z
4 votes

编辑:感谢您的评论-我在6.5.3.4节中说的C99标准中进行了查找:

结果的值是 实现定义的类型 (无符号整数类型)是size_t, 在<stddef.h>(及其他 标头)

因此,未指定size_t的大小,只是它必须是无符号整数类型。 但是,可以在标准的7.18.3章中找到有趣的规范:

限制size_t

size_t

这基本上意味着,无论size_t的大小如何,允许的值范围是0-65535,其余部分取决于实现。

beef2k answered 2020-07-31T08:19:38Z
translate from https://stackoverflow.com:/questions/918787/whats-sizeofsize-t-on-32-bit-vs-the-various-64-bit-data-models