简单地说,size_t类型(size type的联合简写体)就是一个unsigned整数,至于是unsigned int还是unsigned long,就要看平台了。
32位CPU对应unsigned int的size_t;64位CPU对应unsigned long的size_t。
size_t类型来自C语言标准头文件 stdio.h,只要 include 此头文件,就可以直接在代码中使用size_t。
早期的C语言(由Brian Kernighan 和 Dennis Ritchie 在The C Programming Language书中所写,Prentice-Hall, 1978)并没有提供size_t类型,C标准委员会为了解决移植性问题将size_t引入。因此,最经典的C89就有这个类型,C标准库中很多函数的参数类型,都是它,比如malloc(size_t n)。
为什么有size_t这个类型?它的作用是什么?
C标准库中提供size_t类型的目的,是为了让C代码具有更好的可移植性和执行效率。
size type中的size,我理解是指CPU的寻址空间,比如32位系统的寻址空间是4G,正好对应4字节的unsigned int类型,假设进程有一个超大的字符数组,大小就是4G,此时操作这个数组的index,就应该被定义为4字节的unsigned int类型。但有些系统是16位的,平台提供的int是2个字节,但指针大小还是4字节;而现在主流PC都是64位的,但提供的int还是4字节。如果代码对于数组index的定义一直使用unsigned int,在前述16位系统上,就会无法访问超过65535大小的数组;在前述64位系统上,也会出现无法访问长度超过4G的数组。
如果16位的系统,指针也是16位的,代码将index定义为unsigned long,4字节,虽然可以覆盖全部内存地址,但是效率上会受到影响。
size_t类型的出现,就解决了以上说明的代码可移植性和执行效率的问题。
由于size_t类型是标准库中定义的,它的大小一定对应了平台CPU的寻址范围,就不会再出现无法访问的地址段,代码具有了更好的可移植性。size_t始终对应平台指针大小,既保证了覆盖所有地址段,也保证了效率。
因此,数组index之类的数据结构,都可以考虑使用size_t类型来申明其大小,代码的可读性也更好。一看到size_t,就知道这个类型的大小由编译平台决定,可以保证代码可移植性和执行效率。