32 位与各种 64 位数据模型上的 sizeof(size_t) 是多少?
在64位系统上,sizeof(unsigned long)
取决于系统实现的数据模型,例如LLP64(Windows)上为4字节,LP64(Linux等)上为8字节.)。 sizeof(size_t)
应该是什么? 它是否会像 sizeof(long)
那样随数据模型而变化? 如果是这样,怎么办?
参考文献:
On a 64-bit system, sizeof(unsigned long)
depends on the data model implemented by the system, for example, it is 4 bytes on LLP64 (Windows), 8 bytes on LP64 (Linux, etc.). What's sizeof(size_t)
supposed to be? Does it vary with data model like sizeof(long)
does? If so, how?
References:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
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。 一般来说,数据模型只影响静态数据; 例如,在 GCC 中:
您会注意到指针在所有情况下都是 64 位的; 毕竟,拥有 64 位指针但没有 64 位大小没有什么意义。
size_t is defined by the C standard to be the unsigned integer return type of the sizeof operator (C99 6.3.5.4.4), and the argument of malloc and friends (C99 7.20.3.3 etc). The actual range is set such that the maximum (SIZE_MAX) is at least 65535 (C99 7.18.3.2).
However, this doesn't let us determine sizeof(size_t). The implementation is free to use any representation it likes for size_t - so there is no upper bound on size - and the implementation is also free to define a byte as 16-bits, in which case size_t can be equivalent to unsigned char.
Putting that aside, however, in general you'll have 32-bit size_t on 32-bit programs, and 64-bit on 64-bit programs, regardless of the data model. Generally the data model only affects static data; for example, in GCC:
You'll note that pointers are 64-bit in all cases; and there's little point to having 64-bit pointers but not 64-bit sizes, after all.
它应该随架构而变化,因为它代表任何对象的大小。 因此,在 32 位系统上,
size_t
可能至少为 32 位宽。 在 64 位系统上,它可能至少为 64 位宽。it should vary with the architecture because it represents the size of any object. So on a 32-bit system
size_t
will likely be at least 32-bits wide. On a 64-bit system it will likely be at least 64-bit wide.size_t 在 64 位机器上通常是 64 位
size_t is 64 bit normally on 64 bit machine
编辑:感谢您的评论 - 我在 C99 标准,第 6.5.3.4 节中说:
因此,没有指定 size_t 的大小,只是它必须是无符号整数类型。 然而,在该标准的第 7.18.3 章中可以找到一个有趣的规范:
这基本上意味着,无论
size_t
的大小,允许的值范围是从0-65535,其余的取决于实现。EDIT: Thanks for the comments - I looked it up in the C99 standard, which says in section 6.5.3.4:
So, the size of
size_t
is not specified, only that it has to be an unsigned integer type. However, an interesting specification can be found in chapter 7.18.3 of the standard:Which basically means that, irrespective of the size of
size_t
, the allowed value range is from 0-65535, the rest is implementation dependent.