我注意到,现代C和c++代码似乎在几乎所有地方都使用size_t而不是int/unsigned int——从C字符串函数的参数到STL。我很好奇这样做的原因和它带来的好处。


当前回答

size_t类型是sizeof操作符返回的类型。它是一个无符号整数,能够以主机上支持的任何内存范围的字节表示大小。它(通常)与ptrdiff_t相关,因为ptrdiff_t是一个有符号整数值,因此sizeof(ptrdiff_t)和sizeof(size_t)相等。

在编写C代码时,无论何时处理内存范围,都应该使用size_t。

另一方面,int类型基本上定义为主机可以用来最有效地执行整数运算的(有符号)整数值的大小。例如,在许多老式PC类型的计算机上,sizeof(size_t)的值将是4(字节),但sizeof(int)将是2(字节)。16位算法比32位算法更快,尽管CPU可以处理高达4 GiB的(逻辑)内存空间。

只有在关心效率时才使用int类型,因为它的实际精度很大程度上取决于编译器选项和机器架构。特别地,C标准指定了以下不变量:sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)对于每种原语类型程序员可用的精度的实际表示没有其他限制。

注意:这与Java不同(Java实际上为'char', 'byte', 'short', 'int'和'long'类型指定了位精度)。

其他回答

size_t类型是sizeof操作符返回的类型。它是一个无符号整数,能够以主机上支持的任何内存范围的字节表示大小。它(通常)与ptrdiff_t相关,因为ptrdiff_t是一个有符号整数值,因此sizeof(ptrdiff_t)和sizeof(size_t)相等。

在编写C代码时,无论何时处理内存范围,都应该使用size_t。

另一方面,int类型基本上定义为主机可以用来最有效地执行整数运算的(有符号)整数值的大小。例如,在许多老式PC类型的计算机上,sizeof(size_t)的值将是4(字节),但sizeof(int)将是2(字节)。16位算法比32位算法更快,尽管CPU可以处理高达4 GiB的(逻辑)内存空间。

只有在关心效率时才使用int类型,因为它的实际精度很大程度上取决于编译器选项和机器架构。特别地,C标准指定了以下不变量:sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)对于每种原语类型程序员可用的精度的实际表示没有其他限制。

注意:这与Java不同(Java实际上为'char', 'byte', 'short', 'int'和'long'类型指定了位精度)。

经典C语言(Brian Kernighan和Dennis Ritchie在《C编程语言》(Prentice-Hall, 1978)中描述的C语言的早期方言)没有提供size_t。C标准委员会引入size_t来消除可移植性问题

详见embedded.com(有一个很好的例子)

如果我的编译器被设置为32位,size_t就是unsigned int的typedef。如果我的编译器被设置为64位,size_t就是unsigned long long的typedef。

size_t类型必须足够大,以存储任何可能的对象的大小。Unsigned int不需要满足这个条件。

例如,在64位系统中,int和unsigned int可能是32位宽,但size_t必须足够大,可以存储大于4G的数字

size_t类型是无符号整数类型,是sizeof操作符(和偏移操作符)的结果,因此它保证足够大,可以包含系统可以处理的最大对象的大小(例如,8Gb的静态数组)。

size_t类型可能大于、等于或小于unsigned int类型,编译器可能会对它进行优化假设。

您可以在C99标准第7.17节中找到更精确的信息,该标准草案可在Internet上以pdf格式提供,或者在C11标准第7.19节中也可以pdf格式提供。