与各种64位数据模型相比,32位的sizeof(size_t)是多少?

时间:2009-05-28 01:27:06

标签: c 64-bit sizeof size-t

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


参考文献:

64-bit data models on Wikipedia

4 个答案:

答案 0 :(得分:51)

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位。通常,数据模型仅影响静态数据;例如,在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位大小毫无意义。

答案 1 :(得分:10)

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

答案 2 :(得分:4)

编辑:感谢您的评论 - 我在C99 standard中进行了查阅,在第6.5.3.4节中说明了这一点:

  

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

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

  

size_t的限制

     

SIZE_MAX 65535

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

答案 3 :(得分:4)

size_t通常是64位机器上的64位