【发布时间】:2015-11-24 00:42:16
【问题描述】:
首先,我所说的“正确定义”是什么意思?
例如,“C Programming Language”第 2 版中的 K&R,在 2.2 数据类型和大小部分中,对整数做出了非常明确的陈述:
- 整数类型有
short、int和long。需要它们来表示不同边界的值。int是特定硬件的“自然”大小的数字,因此也可能是最快的。- 整数类型
short、int和long的大小完全取决于实现。- 但他们有限制。
short和int应至少保存 16 位。long应至少保存 32 位。short>=int>=long。
这是非常清楚和明确的。 size_t 类型并非如此。在 K&R 5.4 地址算术中,他们说:
- ...
size_t是sizeof运算符返回的无符号整数类型。sizeof运算符产生存储其操作数类型的对象所需的字节数。
在C99 standard draft,在6.5.3.4 sizeof 运算符中,他们说:
- 结果的值是实现定义的,它的类型(无符号整数类型)是
size_t,定义在<stddef.h>(和其他 标题)。
在7.17 通用定义中:
size_t是sizeof运算符结果的无符号整数类型;
在7.18.3 其他整数类型的限制:
- size_t 的限制
SIZE_MAX65535
还有一篇有用的文章——Why size_t matters。上面写着:
- 好的,让我们试着想象一下,如果没有
size_t会怎样。- 例如,让我们从
<string.h>中获取void *memcpy(void *s1, void const *s2, size_t n);标准函数- 让我们使用
int而不是size_t作为n参数。- 但是内存大小不能是负数,所以我们最好取
unsigned int。- 很好,看来我们现在很开心,没有
size_t。- 但是
unsigned int的大小有限 - 如果有一些机器可以复制大于unsigned int可以容纳的内存块怎么办?- 好的,那我们就用
unsigned long吧,现在我们开心了吗?- 但是对于那些使用较小内存块运行的机器,
unsigned long效率会很低,因为long不是“自然的” 对他们来说,他们必须执行额外的操作才能使用longs.- 所以我们为什么需要
size_t- 表示内存的大小,特定硬件可以同时运行。在某些机器上会是 等于int,其他 - 等于long,取决于使用哪种类型 它们是最有效的。
我从中了解到的是size_t 严格限制于sizeof 运算符。因此size_t 表示对象的最大大小(以字节为单位)。它也可能表示特定 CPU 型号可以一次移动的字节数。
但这里对我来说仍然有很多谜团:
- 什么是 C 中的“对象”?
- 为什么它被限制为 65535,这是可以用 16 位表示的最大数字? embedded.com 上的文章说,
size_t也可能是 32 位的。 - K&R 说,
int具有平台的“自然”大小,它可以等于int或long。那么,如果它是“自然的”,为什么不使用它而不是size_t?
更新
有类似的问题:
但它的答案并没有提供明确的定义或权威来源的链接(如果不算维基百科的话)。
我想知道什么时候使用size_t,什么时候不使用size_t,为什么要引入它,以及它真正代表什么。
【问题讨论】:
-
至于你的第二点,65535是最低限度。所以
size_t至少是 16 位,但可能更多。 -
SIZE_MAX的常见定义请注意这里的common,即使它可能意味着common in 1990或所以。 -
标准中的所有限制都是最低限制。这就是为什么 int 的限制是 32767 但实际上现在在大多数系统上 int 的限制是 2^31-1
-
为什么不阅读标准,例如object.