我们如何知道理论上可能的任何类型对象的最大尺寸?

How do we know the maximum size of a theoretically possible object of any type?

Here is the introduction for size_t in cppref

std::size_t can store the maximum size of a theoretically possible object of any type (including array).

我知道具体值取决于平台。但是谁来决定theoretically possible object的大小,是编译器还是操作系统,甚至是计算机制造商呢?理论上可能物体的大小是可以计算出来的还是人为规定的?

此外,如果机器是 64 位的,是否意味着最大对象大小可以是 2^64 字节?

But who decides the size of theoretically possible object [...] ?

"implementation" 的作者有决定权。实现是一个相当模糊的术语,包括编译器、运行-time 库,通常至少是 OS.

的一部分

In addition, if the machine is 64-bit, does that mean the max object size could be 2^64 bytes?

不是真的。你可能不能 超过 264-1 字节,但限制很可能是(通常是,至少在机器当前2018 年,当我写这篇文章时)比那个低得多。许多当前的 CPU 的实际限制要小得多——大约 242-1 可能更现实。

这真的是双向的。

由于 size_tsizeof 运算符的 return 类型,该类型还 设置了 对象的最大大小。要使 sizeof 正常工作,任何对象都不能超过 size_t 可以表示的大小。

无需编译器即可让您使用 所有 可用内存构建单个对象。可能有一个上限,可能size_tptrdiff_t.

类型选择的结果

另一方面,对于当前的 64 位计算机,64 位 size_t 甚至比所需的大得多,因为您目前无法在小于 100 米的计算机中容纳 16 艾字节的 RAM(立方体)。 "theoretically possible" 到此为止。 :-}

if the machine is 64-bit, does that mean the max object size could be 2^64 bytes?

这里的问题是“64 位机器”没有足够的信息来回答这个问题。这里的主要限制因素是指令集可以在任何给定时间寻址多少顺序存储器。由 CPU 架构的设计者决定。

x86有多种执行模式:实模式(16位segmented)、32位模式和64位模式。在这些模式中的每一个中,最大的顺序可寻址存储器区域的大小是不同的。在实模式下,可以寻址 1MB,但顺序只能寻址 64KB,因此 size_t 是 16 位。在其他模式下,整个地址范围可以按顺序寻址。

64 位处理器今天可以物理寻址 48 位并不重要,因为它仍然在完整的 64 位偏移量上运行并且可以理论上寻址 64-有点长的对象。因此 size_t 的宽度仍然是 64 位。

在商品处理器中,size_t 的宽度通常对应于累加器寄存器的大小,因为它定义了 CPU 可以寻址的最大可能偏移量。