我正在阅读有关的文章size_t
在 C/C++ 中http://web.archive.org/web/20081006073410/http://www.embedded.com/columns/programmingpointers/200900195 http://web.archive.org/web/20081006073410/http://www.embedded.com/columns/programmingpointers/200900195(通过 Stackoverflow 找到的链接)。
引用文章中的内容:
类型 size_t 是一个 typedef,它是某些无符号整数的别名
类型,通常为 unsigned int 或 unsigned long,但甚至可能
无符号长长。每个标准 C 实现都应该
选择足够大的无符号整数——但不大于
需要——来表示最大可能物体的尺寸
目标平台。
如何确定机器上最大可能物体的尺寸?
什么影响最大物体的尺寸(除了处理器)?
欢迎链接详细解释。
编辑:我认为重要的是要考虑到这种类型并不严格意味着您可以拥有该大小的对象 - 只是它是一个足够大的整数来容纳最大可能对象的大小 - 这并不意味着你可以使用SIZE_MAX
来分配内存。它只是保证最大可能的对象不能大于SIZE_MAX
.
这是编译器实现的架构决定(通常又基于编译器所针对的操作系统,但操作系统可以提供比编译器更多的功能,或者编译器可以支持比操作系统更多的理论量)允许,只是当你要求它时它会失败)。
实际上,几乎总是处理器决定了这一点 -size_t
几乎总是与处理器的位数匹配 - 例如在 32 位处理器中它是 32 位,在 64 位处理器中是 64 位。但设计一个在 64 位处理器上运行 32 位的系统是可能的——一个“对象”不能大于 4GB,这实际上并不是一个很大的限制。这只是意味着你不能使用单个向量int
填充超过 4GB,因此目录中的条目不超过 1Gvector
(or 4G char
条目)。
当然,另一个限制因素是可用内存 - 如果您有一台非常旧的机器,有 256MB RAM,它不会允许您分配 4GB,即使size_t
允许它。但是给同一台机器更多的内存,你就可以使用更大的尺寸。
在许多 32 位系统上,应用程序允许的最大内存小于 4GB(完整的 32 位范围),因为内存的某些部分被“保留”以供其他用途。那么,再次,size_t
是 32 位,因此允许 4GB,但它实际上并不支持单个应用程序使用的全部内存量 - 另一方面,32 位机器可以拥有超过 4GB 的 RAM,并且可以使用它在多个应用程序之间。
另外,如果系统(由于某些架构原因)受到限制,例如 16MB 内存,size_t
最有可能仍然是 32 位无符号整数 - 因为大多数处理器不处理 24 位整数 [某些 DSP 可能会这样做,但常规 16 或 32 位处理器不会]。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)