繁体   English   中英

为什么int的size_t足以满足数组的大小?

[英]Why size_t when int would suffice for the size of an array?

C标准保证int能够存储所有可能的数组大小。 至少,我从阅读第6.5.2.1节第1节(数组下标约束)中了解到:

其中一个表达式的类型应为“指向对象类型的指针”,另一个表达式的类型应为整数,结果的类型为“ type”。

由于我们将int用作数组下标,为什么我们应该使用size_t来确定数组的大小?

为什么int足够时strlen()返回size_t

术语“整数类型”并不表示int -例如, charshort是整数类型。

仅仅因为您可以使用int对数组下标并不意味着它可以到达所有可能的数组元素。

更具体地说,关于size_tint例子是平台,其中int可能是16位类型,而size_t可能是32位类型(或者更常见的32位int与64位size_t区别是当今的64位平台)。

整数类型不一定是“ int”。 “ long long”和“ size_t”也是整数类型。

阵列可以大于2GB。 对于那些编写内存占用程序的人来说,此属性非常方便,例如具有大缓冲池的DBMS,具有大内存缓存的应用服务器等。大于2GB / 4GB的数组是64位计算的全部要点:)

size_t对于strlen(),至少听起来与C标准如何处理数组兼容,是否有意义,或者是否有人看到过这么大的字符串,这是另一个问题。

首先,您在标准中引用的内容没有专门引用int类型。 不, int不能保证足以存储C中任何对象(包括数组)的大小。

其次,C语言实际上并没有专门的“数组订阅”。 数组订阅是通过指针算法实现的。 指针算术中的整数操作数具有ptrdiff_t类型。 不是size_t ,不是int ,而是ptrdiff_t 它是一个带符号的类型BTW,表示该值可以为负。

第三, size_t的目的是存储程序中任何对象的大小(即存储sizeof的结果)。 它不立即打算用作数组索引。 它恰好可以用作数组索引,因为可以确保它始终足够大以索引任何数组。 但是,从抽象的角度来看,“数组”是一种特定的“容器”,并且还有其他类型的容器(基于列表的容器,基于树的容器等)。 在一般情况下, size_t不足以存储任何容器的大小,在一般情况下,这也使其成为数组索引的可疑选择。 (另一方面, strlen是专门用于数组的函数,这使得size_t在那里适用。)

编写C标准时,机器通常具有16位的“ int”类型,并且不能处理大于65535字节的任何单个对象,但是仍然能够处理大于32767字节的对象。 由于对无符号int进行算术运算将足以处理此类对象的最大大小,而对有符号int进行算术运算则无法做到,因此将size_t定义为无符号以便无需使用“长”计算即可容纳此类对象。

在最大允许对象大小在INT_MAX和UINT_MAX之间的机器上,指向此类对象的开始和结束的指针之间的差异可能太大而无法放入“ int”。 尽管标准没有对实现方式的处理方式提出任何要求,但是一种常见的方法是定义整数和指针的环绕行为,例如,如果S和E是指向char的开头和结尾的指针,则[49152]即使ES超过INT_MAX,它也会产生一个值,当将其添加到S时,它将产生E。

如今,size_t是无符号类型这一事实几乎没有任何真正的好处(因为需要大于2GB的对象的代码出于其他原因经常需要使用64位指针),并且它导致涉及对象大小的多种比较行为违反直觉,但是表达式的sizeof产生了一个无符号类型这一事实已经根深蒂固,以至于不可能改变。

size_t是无符号整数的typedef(例如int或long)。

在某些64位平台上,int可以为32位,而size_t可以为64位。

它用作更标准的尺寸方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM