因此,您可能会问,为什么不使用unsigned long int呢?在某些平台上,这会造成性能损失。标准C要求long占用至少32位。IP16L32平台将每个32位长实现为一对16位字。在这些平台上,几乎所有32位操作符都需要两条指令,如果不是更多的话,因为它们在两个16位块中处理32位。例如,移动一个32位长的数据块通常需要两条机器指令——一条用于移动每个16位的数据块。
使用size_t可以避免这种性能损失。根据这篇精彩的文章,“类型size_t是一个类型定义,它是一些无符号整数类型的别名,通常是unsigned int或unsigned long,但甚至可能是unsigned long long。每个标准C实现都应该选择足够大的无符号整数,但不能超过所需的大小,以表示目标平台上可能存在的最大对象的大小。”
在2.4版之前的GCC的size_t类型和版本中存在一个潜在的问题。ANSI C要求size_t始终是无符号类型。为了与现有系统的头文件兼容,GCC在stddef.h' to be whatever type the system'ssys/types.h中定义size_t为。大多数Unix系统在`sys/types.h'中定义size_t,将其定义为有符号类型。库中的一些代码依赖于size_t是无符号类型,如果它是有符号类型,则不能正确工作。
希望size_t为unsigned的GNU C库代码是正确的。size_t作为有符号类型的定义是不正确的。我们计划在2.4版中,GCC将始终将size_t定义为无符号类型,而fixincludes' script will massage the system'ssys/types.h'则不会与此冲突。