什么是“目标平台上最大可能对象的大小”,以size_t表示

我正在阅读C / C ++中有关size_t文章http://web.archive.org/web/20081006073410/http://www.embedded.com/columns/programmingpointers/200900195 (通过Stackoverflow找到的链接)。

从文章引用:

类型size_t是一个typedef,它是某些无符号整数类型的别名,通常是unsigned int或unsigned long,但可能甚至是unsigned long long。 每个标准C实现都应该选择足够大的无符号整数 – 但不要大于所需的 – 来表示目标平台上最大可能对象的大小。

如何确定机器上最大可能对象的大小?

什么影响最大对象的大小(除了处理器)?

欢迎详细解释链接。

编辑:我认为重要的是要考虑到这种类型并不严格意味着你可以有一个这样大小的对象 – 只是它是一个足够大的整数来保持最大可能对象的大小 – 这并不意味着你可以使用SIZE_MAX来分配内存。 它只是保证最大可能的对象不能比SIZE_MAX更大。

这是编译器实现的架构决策(通常依次是基于编译器所针对的操作系统,但操作系统可以提供比编译器更多的操作系统,或者编译器可以支持超过操作系统的理论量)允许,只是当你要求时它会失败)。

实际上,几乎总是处理器确定这一点 – size_t几乎总是匹配处理器的位数 – 例如,32位处理器中的32位,64位处理器中的64位。 但是有可能在64位处理器上设计一个32位的系统 – 一个“对象”不能大于4GB并不是那么大的限制。 它只是意味着你不能使用一个int单个向量来填充超过4GB,因此向量中不超过1G条目(或4G char条目)。

当然,另一个限制因素是可用内存 – 如果你有一台装有256MB RAM的旧机器,即使size_t允许,它也不会允许你分配4GB。 但是给同一台机器更多的内存,你可以去更大的尺寸。

在许多32位系统上,应用程序允许的最大内存小于4GB(完整的32位范围),因为某些内存部分被“保留”用于其他用途。 同样, size_t是32位,所以允许4GB,但它实际上并不支持单个应用程序使用的全部内存 – 另一方面,32位机器可能有超过4GB的内存RAM,并在多个应用程序之间进行分配。

此外,如果系统受限(由于某些架构原因),比如说,16MB的内存, size_t很可能仍然是32位无符号整数 – 因为大多数处理器不执行24位整数[某些DSP可能会这样做,但常规的16或32位处理器不]。

编译器为您提供“最大可能对象的大小”信息是没有意义的,因为它取决于您的程序是什么和做什么。 在32位体系结构上,一个对象的大小可以限制为2 31 -1个字节,以避免签名类型ptrdiff_t溢出问题,或者实现者可能选择不放置任何此类任意限制,在这种情况下,大小为一个对象可以有多少取决于为堆栈保留多少虚拟空间,代码,文件范围变量,OS的地址随机化策略是什么……没有单一的确切“最大对象的大小”,除非你的意思是明显的上限,例如虚拟地址空间的大小。

类型size_t保证允许表示在最佳情况下可以分配的最大对象的大小:小代码,最小堆栈,没有浪费来解决空间随机化,没有其他变量。 例如,我希望一些64位内核(在x86-64架构上)可以将整个4GiB的虚拟地址空间留给32位进程,例如由32位编译器生成的程序,SIZE_MAX = 2 32 -1,在这种情况下,对象可能在理论限制的几兆字节内。 我在实践中观察到的最大值是2.5GiB,32位size_t