[英]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
-例如, char
和short
是整数类型。
仅仅因为您可以使用int
对数组下标并不意味着它可以到达所有可能的数组元素。
更具体地说,关于size_t
与int
例子是平台,其中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.