首先,我所说的“正确的定义”是什么意思?
例如,K&R《C 程序设计语言》第二版。,在部分2.2 数据类型和大小,对整数做出非常清楚的陈述:
- 有
short
, int
and long
对于整数类型。它们需要代表不同边界的值。
-
int
是特定硬件的“自然”大小的数字,因此也可能是最快的。
- 整数类型的大小
short
, int
and long
纯粹依赖于实现。
- 但他们有限制。
-
short
and int
应至少保存 16 位。
-
long
应至少保存 32 位。
-
short
>= int
>= long
.
这是非常清楚和明确的。但事实并非如此size_t
类型。在 K&R 5.4 地址算术中,他们说:
- ...
size_t
是返回的无符号整数类型sizeof
操作员。
- The
sizeof
运算符产生存储其操作数类型的对象所需的字节数。
In C99标准草案 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf, in 6.5.3.4 sizeof 运算符, 他们说:
- 结果的值是实现定义的,其类型(无符号整数类型)是
size_t
,定义于<stddef.h>
(和别的
标题)。
In 7.17 通用定义:
-
size_t
这是 sizeof 运算符结果的无符号整数类型;
In 7.18.3 其他整数类型的限制:
还有一篇很有用的文章——为什么 size_t 很重要 http://www.embedded.com/electronics-blogs/programming-pointers/4026076/1/Why-size-t-matters。它说如下:
- 好吧,让我们试着想象一下,如果没有的话会怎样?
size_t
.
- 例如,我们以
void *memcpy(void *s1, void const *s2, size_t n);
标准函数来自<string.h>
- 让我们使用
int
代替size_t
for n
范围。
- 但内存大小不能为负,所以我们最好采取
unsigned int
.
- 很好,看来我们现在很幸福,没有
size_t
.
- But
unsigned int
大小有限 - 如果有一台机器可以复制大于unsigned int
能把持住?
- 好的,我们来使用
unsigned long
那么,现在我们幸福吗?
- 但对于那些使用较小内存块运行的机器来说,
unsigned long
效率会很低,因为long
不是“自然的”
对于他们来说,他们必须执行额外的操作才能与long
s.
- 那么我们为什么需要
size_t
- 表示特定硬件可以立即运行的内存大小。在某些机器上会是
等于int
, 对其他人 - 至long
,取决于哪种类型
他们是最有效率的。
我从中了解到的是size_t
严格限制于sizeof
操作员。因此size_t
表示对象的最大大小(以字节为单位)。它还可能表示特定 CPU 型号可以一次移动的字节数。
但这里对我来说仍然有很多谜团:
- C语言中的“对象”是什么?
- 为什么它被限制为 65535,这是 16 位可以表示的最大数字?文章关于嵌入式网站说,那
size_t
也可以是32位的。
- K&R 说,
int
平台具有“自然”大小,它可以等于int
or to long
。那么为什么不使用它来代替size_t
如果它是“自然的”?
UPDATE
还有类似的问题:
C 中的 size_t 是什么? https://stackoverflow.com/questions/2550774
但它的答案没有提供明确的定义或权威来源的链接(如果不算维基百科)。
我想知道什么时候使用size_t
,什么时候不使用size_t
,为什么引入它,以及它真正代表什么。
何时使用size_t
Use size_t
表示非负索引,并使用可追溯到的值sizeof
表达。
何时不使用size_t
每当一个值可能为负数时,例如当你减去指针时。这对于指向同一数组的指针是允许的,但它可能会产生负数,具体取决于指针的相对位置。还有另一种类型ptrdiff_t
针对这种情况定义的。
为什么引入它
标准的设计者可以选择引入单独的类型,或者要求现有类型能够容纳尺寸。第一个选择为编译器编写者提供了更大的灵活性,因此设计者选择了单独的类型。
它真正代表什么
它能够表示内存中对象的大小,无论是数组还是数组struct
,一个数组struct
s,数组的数组struct
s,或其他任何东西。大小以字节表示。
该类型也方便用于非负索引,因为它可以以最大粒度表示对任何大小的结构的索引(即对最大可能数组的索引)char
s,因为标准要求char
具有尽可能小的尺寸1
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)