我们如何知道任何类型的理论上可能的对象的最大尺寸?
Posted
技术标签:
【中文标题】我们如何知道任何类型的理论上可能的对象的最大尺寸?【英文标题】:How do we know the maximum size of a theoretically possible object of any type? 【发布时间】:2018-12-16 03:28:10 【问题描述】:Here is the introduction for size_t
in cppref
std::size_t
可以存储任何类型(包括数组)理论上可能的对象的最大大小。
我知道确切的值取决于平台。但是谁来决定theoretically possible object
的大小,是编译器还是操作系统,甚至是计算机制造商?理论上可能的物体的大小是可以计算出来的还是人为的规则决定的?
另外,如果机器是 64 位的,那是否意味着最大对象大小可以是 2^64 字节?
【问题讨论】:
理论上限是您的实现可以解决的问题。带有编译器的 64 位机器发出 64 位代码以生成 64 位可执行文件,可以(理论上)寻址数量高达 2^64-1。由于(嗯)实际限制,实际上限小于该上限,例如在 64 位系统上运行的 32 位程序(如果操作系统支持)只能寻址 32 位,多少内存的配额一个操作系统可能允许一个进程分配,虚拟内存(粗略地说,物理 RAM 和交换空间的总和)可能比理论上可以解决的要少。 【参考方案1】:但谁来决定理论上可能的对象的大小 [...] ?
“实施”的作者可以做出决定。实现是一个相当模糊的术语,包括编译器、运行时库,通常至少包括操作系统的一部分。
另外,如果机器是 64 位的,是否意味着最大对象大小可以是 2^64 字节?
不是真的。您可能无法超过 264-1 个字节,但限制可能是(通常会是,至少在我写作时截至 2018 年的机器电流)这)远低于那。当前许多 CPU 的实际限制要小得多——大约 242-1 可能更现实。
【讨论】:
【参考方案2】:确实是双向的。
由于size_t
是sizeof
运算符的返回类型,该类型也设置对象的最大大小。要使sizeof
工作,任何对象都不能超过size_t
可以表示的大小。
没有什么需要编译器让您使用所有可用内存构建单个对象。可能有一个上限,可能是size_t
和ptrdiff_t
类型选择的结果。
另一方面,对于当前的 64 位计算机,64 位 size_t
甚至比所需的大得多,因为您目前无法在小于 100 米(立方)的计算机中安装 16 EB 的 RAM。 “理论上可能”就这么多。 :-
【讨论】:
即使有足够的空间,当前的 CPU 也不会使用 64 位地址字的所有位(而且这不仅仅是缺少位)。 正确,这与您需要 10 亿 个 16 GB RAM 模块来填充 exabytes 的事实有关。我的电脑只有 4 个插槽。 :-( 这是一个合理的决定。问题是现代计算机确实已经接近这个限制。虽然我怀疑你或我在不久的将来会受到影响。但谁知道呢。很快 640KiB 就不够了。【参考方案3】:如果机器是 64 位的,这是否意味着最大对象大小可以是 2^64 字节?
这里的问题是“64 位机器”没有足够的信息来回答这个问题。这里的主要限制因素是指令集在任何给定时间可以寻址多少顺序内存。由 CPU 架构的设计者决定。
x86 有多种执行模式:实模式(16 位segmented)、32 位模式和 64 位模式。在这些模式的每一种中,最大的顺序可寻址内存区域的大小是不同的。在实模式下,可以寻址 1MB,但顺序只能寻址 64KB,因此size_t
是 16 位。在其他模式下,可以顺序寻址整个地址范围。
今天,64 位处理器可以物理寻址 48 位并不重要,因为它仍然可以在完整的 64 位偏移上运行,并且理论上可以寻址 64 位长的对象。因此size_t
的宽度仍然是 64 位。
在商用处理器中,size_t
的宽度通常对应于累加器寄存器的大小,因为它定义了 CPU 可以处理的最大可能偏移量。
【讨论】:
以上是关于我们如何知道任何类型的理论上可能的对象的最大尺寸?的主要内容,如果未能解决你的问题,请参考以下文章