对象的最大可能大小由 C 实现所针对的体系结构的内存映射决定(原则上,和/或其他实现细节,但实际上就是这样做的)。
在包括当今使用的大多数系统的所谓“平面”内存模型上,这意味着对象几乎可以是整个地址空间的大小(资源允许),因此您希望size_t
是指针。如果您的地址空间是 32 位,那么由于对象的每个字节都有不同的地址,因此您显然不能拥有大于 2^32-1 字节的对象(-1,因为空指针值“用完”一个地址,即保证不是任何对象的地址)。
在分段内存架构上,您的 C 实现可能可以寻址 2^32 字节的空间,但不允许单个对象跨越多个 16 位段,因此原则上size_t
可以是 16 位类型。
就此而言,允许 C 实现者对 进行任意限制malloc
,出于纯粹的恶作剧,它永远不会返回大于 2^24-1 字节的块。在编译器中具有相同的限制以防止该大小的静态或自动对象,size_t
即使指针更大,也可以是 24 位类型。
You'd hope that no implementer would do this solely for the fun of it, but there might be practical reasons for that 24 bit limit to exist. For example if the implementation uses a maximum of 16MB RAM for dynamic allocations and a separate limit of 16MB for static objects, then no object could be bigger than 16MB but a pointer has to be at least 25 bits. Even in that case, I doubt that an implementer would bother making size_t
a 24-bit type, it would most likely still be 32 bits. But the standard allows the implementer to choose what's best.
你说,“访问最大数据对象的大小就足够了,但不是更大”。它不能更大是不正确的。例如,如果平台的某些技术限制意味着任何对象都不能大于 2^31-1 字节,那么就不能说size_t
必须是 31 位类型。它被允许为 32 位类型,因为所需要的只是它足够大。