3

我正在阅读有关size_tC/C++ 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 实现都应该选择足够大的无符号整数(但不大于所需)来表示目标平台上最大可能对象的大小。

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

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

欢迎链接详细解释。

4

2 回答 2

7

编辑:我认为重要的是要考虑到这种类型并不严格意味着您可以拥有该大小的对象-只是它是一个整数,足以容纳最大可能对象的大小-这并不意味着您可以使用它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 位处理器没有]。

于 2013-08-18T22:37:59.620 回答
4

编译器给你“最大可能对象的大小”信息是没有意义的,因为它取决于你的程序是什么以及做什么。在 32 位架构上,一个对象的大小可能被限制为 2 31ptrdiff_t -1 字节,以避免有符号类型的溢出问题,或者实现者可能选择不设置这样的任意限制,在这种情况下,一个对象的大小可以has 取决于为堆栈、代码、文件范围变量、操作系统的地址随机化策略保留了多少虚拟空间……没有一个确切的“最大对象的大小”,除非你的意思是明显的上限绑定如虚拟地址空间的大小。

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

于 2013-08-18T22:32:58.473 回答