如果 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
,鉴于现代计算机技术,实际限制几乎肯定会被其他东西强加。
我看到了几个接近于此但不是具体答案的答案。
如果 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
,鉴于现代计算机技术,实际限制几乎肯定会被其他东西强加。