我已经看到了几个接近这个但没有具体答案的答案。
如果size_t设置为64位,那么2 ^ 64大约是18个quintillion标准字符(通常是字节)作为char *数组的最大大小。如果除以10 ^ 9(GB),我们最终得到 18GB 作为最大理论值(如果有可能购买32GB的笔记本电脑 - 那么也是实际的)限制内存中阵列的大小
对于64位计算机上的字符串/字符串,18GB是否真的有限制?或者我在推理中错过了哪些内容?
我正在做我的第一个真正的CS课程,所以请原谅我,如果我的理解有任何严重错误。
EDIT 对于读这篇文章的人来说,看起来我的数学是错误的,所以请务必阅读下面的答案。特别是当我除以10 ^ 9时,这将答案转换为GB单位,但仍然有18 * 10 ^ 9的GB。这相当于18艾字节。
答案 0 :(得分:2)
如果SIZE_MAX
是64位,那么(假设没有填充位)size_t
是2 64 -1,或18446744073709551615.这有点超过18 exabytes ,或大约170亿千兆字节。
(它是17而不是18,因为在这种情况下,前缀“kilo”,“mega”,“giga”等代表1024的权力,而不是1000.近年来,binary prefixes有已经被引入,明确代表1024的权力,但他们没有看到广泛使用。)
是的,这意味着2 64 -1是 上限,用于程序可以创建的任何对象的大小。 (标准中存在一些含糊之处,但意图是size_t
可以表示任何对象的大小。)
这并不意味着你实际上可以创建一个大的对象。 2 64 -1是 对象大小的上限,但不是(必然)最小上限。在实践中,其他考虑因素(例如可用内存量(物理和/或虚拟)和机器寻址限制)通常会施加更小的限制。
在具有32位size_t
的系统上,最大理论对象大小约为4千兆字节,在现代系统上可能是实际限制。对于64位{{1}},在给定现代计算机技术的情况下,实际限制几乎肯定会被其他东西强加。
答案 1 :(得分:1)
1 GB = 2 ^ 30或约10 ^ 9
因此2 ^ 64 in GB是2 ^(64-30)= 2 ^ 34 = 17,179,869,184GB ... 18 GGB"十八千兆字节" ;)
答案 2 :(得分:1)
你的数学错了。是的,2 ^ 64大约是18个quintillion地址...但你错了除以10 ^ 9。你没有18千兆字节的地址,你有180亿千兆字节 - 18个五分之一地址,正如你在开始时所说的那样。
16位是64K; 32位是4 GB; 64位是16艾字节。