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


当前回答

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

其他回答

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

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

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

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

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

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

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

这段摘自glibc手册0.02的摘录在研究这个主题时也可能是相关的:

在2.4版之前的GCC的size_t类型和版本中存在一个潜在的问题。ANSI C要求size_t始终是无符号类型。为了与现有系统的头文件兼容,GCC将stddef.h'中的size_t定义为系统的sys/types.h'所定义的类型。大多数Unix系统在`sys/types.h'中定义size_t,将其定义为有符号类型。库中的一些代码依赖于size_t是无符号类型,如果它是有符号类型,则不能正确工作。

希望size_t为unsigned的GNU C库代码是正确的。size_t作为有符号类型的定义是不正确的。我们计划在2.4版中,GCC将始终将size_t定义为无符号类型,fixincludes'脚本将修改系统的sys/types.h',以避免与此冲突。

与此同时,我们通过告诉GCC在编译GNU C库时显式地为size_t使用unsigned类型来解决这个问题。' configure'将自动检测GCC使用什么类型的size_t,如果需要,将重写它。

Size_t是指针的大小。

所以在32位或常见的ILP32(整数,长,指针)模型中,size_t是32位。 在64位或常见的LP64(长指针)模型中,size_t是64位(整数仍然是32位)。

还有其他模型,但这些是g++使用的模型(至少在默认情况下)