C 尺寸的正确定义是什么?

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

首先,我所说的“正确定义”是什么意思

例如,《C编程语言》第二版中的K&R在第2.2节“数据类型和大小”中对整数作了非常明确的说明:

  • 整数类型有
    short
    int
    long
    。它们需要重复不同边界的值
  • int
    是特定硬件的“自然”大小的数字,因此可能也是最快的
  • 整数类型
    short
    int
    long
    的大小完全取决于实现
  • 但他们有限制
  • short
    int
    应至少保存16位
  • long
    应至少保存32位
  • short
    =
    int
    =
    long
这是非常清楚和明确的。对于
size\u t
type,情况并非如此。在K&R 5.4地址算法中,他们说:

  • size\u t
    是由
    sizeof
    运算符返回的无符号整数类型
  • sizeof
    运算符生成存储其操作数类型的对象所需的字节数
6.5.3.4中,运算符的大小表示:

  • 结果的值由实现定义,其类型(无符号整数类型)为
    size\t
    ,在
    中定义(和其他 标题)
7.17通用定义中

  • size\u t
    它是sizeof运算符结果的无符号整数类型
7.18.3其他整数类型的限制中

  • 尺寸限制\u t
    size\u MAX
    65535
还有一篇有用的文章-。它说:

  • 好的,让我们试着想象一下,如果没有
    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
    不是“自然的” 对于它们,它们必须执行其他操作才能使用
    long
    s
  • 那么让我们来解释为什么我们需要
    size\u t
    -来表示内存的大小,特定的硬件可以同时运行。在某些机器上是这样的 等于
    int
    ,在其他类型上等于-to
    long
    ,具体取决于所使用的类型 他们是最有效率的
我从中了解到,
size\u t
严格限定为
sizeof
运算符。因此,
size\u t
表示对象的最大大小(以字节为单位)。它还可能表示特定CPU模型可以同时移动的字节数

但对我来说,这里仍然有很多神秘之处:

  • 什么是C中的“对象”
  • 为什么它被限制为65535,这是可以用16位表示的最大数字?embedded.com上的文章说,
    size\u t
    也可以是32位
  • 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