编辑:我认为重要的是要考虑到这种类型并不严格意味着您可以拥有该大小的对象-只是它是一个整数,足以容纳最大可能对象的大小-这并不意味着您可以使用它SIZE_MAX
来分配内存。它只是保证最大可能的对象不能大于SIZE_MAX
。
这是编译器实现的架构决定(通常反过来基于编译器所针对的操作系统,但操作系统可以提供比编译器更多的功能,或者编译器可以支持比操作系统更多的理论数量允许,只是当你要求它时它会失败)。
实际上,几乎总是由处理器决定这一点——size_t
几乎总是与处理器的位数相匹配——例如,在 32 位处理器中是 32 位,在 64 位处理器中是 64 位。但是可以设计一个在 64 位处理器上为 32 位的系统——一个“对象”不能大于 4GB 并不是一个很大的限制,真的。这只是意味着您不能使用单个向量int
来填充超过 4GB,因此vector
(或 4Gchar
条目)中的条目不超过 1G。
当然,另一个限制因素是可用内存——如果你有一台非常旧的机器,有 256MB 的 RAM,它不会允许你分配 4GB,即使size_t
它允许。但是给同一台机器更多的内存,你可以去更大的尺寸。
在许多 32 位系统上,应用程序允许的最大内存小于 4GB(完整的 32 位范围),因为部分内存“保留”用于其他用途。同样,它size_t
是 32 位,因此允许 4GB,但它实际上并不支持单个应用程序使用的全部内存量 - 另一方面,32 位机器可能有超过 4GB 的 RAM ,并在多个应用程序之间分配。
此外,如果系统受到限制(由于某些架构原因),例如 16MB 内存,size_t
很可能仍然是 32 位无符号整数 - 因为大多数处理器不做 24 位整数 [一些 DSP 可能会这样做,但普通的 16 位或 32 位处理器没有]。