C 尺寸的正确定义是什么?
首先,我所说的“正确定义”是什么意思 例如,《C编程语言》第二版中的K&R在第2.2节“数据类型和大小”中对整数作了非常明确的说明:C 尺寸的正确定义是什么?,c,c99,c11,size-t,C,C99,C11,Size T,首先,我所说的“正确定义”是什么意思 例如,《C编程语言》第二版中的K&R在第2.2节“数据类型和大小”中对整数作了非常明确的说明: 整数类型有short、int和long。它们需要重复不同边界的值 int是特定硬件的“自然”大小的数字,因此可能也是最快的 整数类型short、int和long的大小完全取决于实现 但他们有限制 short和int应至少保存16位 long应至少保存32位 short=int=long 这是非常清楚和明确的。对于size\u ttype,情况并非如此。在K&R
- 整数类型有
、short
和int
。它们需要重复不同边界的值long
是特定硬件的“自然”大小的数字,因此可能也是最快的int
- 整数类型
、short
和int
的大小完全取决于实现long
- 但他们有限制
和short
应至少保存16位int
应至少保存32位long
=short
=int
long
size\u t
type,情况并非如此。在K&R 5.4地址算法中,他们说:
- …
是由size\u t
运算符返回的无符号整数类型sizeof
运算符生成存储其操作数类型的对象所需的字节数sizeof
- 结果的值由实现定义,其类型(无符号整数类型)为
,在size\t
中定义(和其他 标题)
它是sizeof运算符结果的无符号整数类型李>size\u t
- 尺寸限制\u t
65535size\u MAX
- 好的,让我们试着想象一下,如果没有
,会是什么样子李>size\u t
- 例如,我们取
void*memcpy(void*s1,void const*s2,size\u t n)代码>来自
- 对于
参数,让我们使用n
而不是int
size\u t
- 但内存的大小不能为负,所以我们最好采用
unsigned int
- 很好,似乎我们现在很开心,没有了
尺码\u t
- 但是
的大小有限-如果有某种机器可以复制大于unsigned int
所能容纳的内存块,该怎么办unsigned int
- 好的,让我们使用
那么,现在我们高兴了吗无符号long
- 但是对于那些使用较小内存块的机器,
将是低效的,因为unsigned long
不是“自然的” 对于它们,它们必须执行其他操作才能使用long
slong
- 那么让我们来解释为什么我们需要
-来表示内存的大小,特定的硬件可以同时运行。在某些机器上是这样的 等于size\u t
,在其他类型上等于-toint
,具体取决于所使用的类型 他们是最有效率的long
size\u t
严格限定为sizeof
运算符。因此,size\u t
表示对象的最大大小(以字节为单位)。它还可能表示特定CPU模型可以同时移动的字节数
但对我来说,这里仍然有很多神秘之处:
- 什么是C中的“对象”
- 为什么它被限制为65535,这是可以用16位表示的最大数字?embedded.com上的文章说,
也可以是32位size\u t
- K&R表示,
具有平台的“自然”大小,可以等于int
或int
。如果它是“天然的”,为什么不使用它而不是long
size\t
size\u t
,什么时候不使用size\u t
,为什么引入它,以及它真正代表了什么
什么是C中的“对象”
“对象”是一个已定义的术语。C99标准将其定义为:“执行环境中的数据存储区域,其内容可以表示值”(第3.14节)。一个更通俗的定义可能是“存储在内存中的值”。根据存储的值的类型,对象有不同的大小。该类型不仅包括简单类型,如char
和int
,还包括复杂类型,如结构和数组。例如,数组的存储是一个对象,其中每个元素都有一个对象
为什么它被限制为65535,这是可以用16位表示的最大数字?embedded.com上的文章说,这个大小也可能是32位
你误解了。重新阅读第7.18.3节的前两段SIZE\u MAX
表示类型SIZE\u t
的最大值,但其实际值取决于实现。标准中给出的值是可以使用的最小值。在大多数实现中,它更大
K&R表示,int对于平台来说是“自然”大小,可以等于int,也可以等于long。那么,如果它是“天然的”,为什么不使用它而不是尺寸呢
因为没有特别的理由将对象的最大大小限制为单个机器字中可表达的字节数(这几乎就是“自然大小”的意思)。如果int
和long
的大小不同,也不清楚哪一个应该对应于size\u t
,如果其中一个。U