如果 size_t 是 64 位,那么 char 数组的最大大小是多少?

if size_t is 64 bits what is the maximum size of a char array?

我看到了几个接近于此但不是具体答案的答案。

如果 size_t 设置为 64 位,则 2^64 大约是 char* 数组的最大大小的 18 个 quintillion 标准字符(通常是字节)。如果除以 10^9 (GB),我们最终得到 18GB 作为最大理论值(如果有可能购买 32GB 的笔记本电脑 - 那么也是真实的)限制一个文件的大小内存中的数组。

18GB 真的是 64 位机器上 char arrays/strings 的限制吗?还是我在推理中遗漏了什么?

我正在学习我的第一门真正的 CS 课程,所以如果我的理解有任何严重错误,请原谅。

编辑 对于任何读到这篇文章的人来说,我的数学似乎是错误的,所以一定要阅读下面的答案。具体来说,当我除以 10^9 时,这会将答案转换为 GB 单位,但仍然有 18 * 10^9 这些 GB。相当于 18 艾字节。

1 GB = 2^30 或大约 10^9

所以 GB 中的 2^64 是 2^(64-30) = 2^34 = 17,179,869,184GB ... 18 GGB "eighteen giga-gigabytes" ;)

你的数学有误。是的,2^64 大约是 18 个 quintillion 地址……但你除以 10^9 时出错了。你没有 18 GB 的地址,你有 180 亿 GB - 18 quintillion 地址,正如你在开始时提到的那样。

16位为64K; 32 位是 4 GB; 64 位是 16 艾字节。

如果size_t是64位,那么(假设没有padding位)SIZE_MAX是264-1,即18446744073709551615。有点过头了18 艾字节,或约 170 亿千兆字节。

(它是 17 而不是 18,因为在这种情况下,前缀 "kilo"、"mega"、"giga" 等代表 1024 的幂,而不是 1000 的幂。最近多年来,binary prefixes 已经被引入,明确表示 1024 的幂,但它们还没有被广泛使用。)

是的,这意味着 264-1 是您的程序可以创建的任何对象大小的 an 上限。 (标准中有些歧义,但意图是 size_t 可以表示任何对象的大小。)

这并不意味着您实际上可以创建那么大的对象。 264-1 是对象大小的 an 上限,但不是(必然) least 上限。实际上,其他考虑因素,例如可用内存量(物理 and/or 虚拟)和机器寻址限制,通常会施加更小的限制。

在具有 32 位 size_t 的系统上,最大理论对象大小约为 4 GB,而在现代系统上,这可能是一个实际限制。对于 64 位 size_t,鉴于现代计算机技术,实际限制几乎肯定会被其他东西强加。