C -如果size_t是64位,那么字符数组的最大长度是多少?



我看到过几个类似的答案,但不是一个具体的答案。

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

18GB真的是64位机器上字符数组/字符串的限制,还是我在推理中错过了什么?

我正在上我的第一堂真正的CS课,所以如果我的理解有什么严重的错误,请原谅。

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

如果size_t是64位,那么(假设没有填充位)SIZE_MAX是264-1,或18446744073709551615。这是超过18 艾字节,或约170亿gb。

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

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

这并不意味着你可以创建一个那么大的对象。264-1是对象大小的上界,但不一定是最小上界。在实践中,其他考虑因素,如可用内存量(物理和/或虚拟)和机器寻址限制,通常会施加更小的限制。

在32位size_t系统上,最大的理论对象大小大约是4gb,而在现代系统上,这可能是一个实际限制。对于64位size_t,考虑到现代计算机技术,实际的限制几乎肯定会由其他东西施加。

你的数学错了。是的,2^64大约是18百亿亿个地址…但你错了,除以10^9。你没有18gb的地址,你有180亿gb——18千兆的地址,正如你在开始时注意到的。

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

1 GB = 2^30或约10^9

所以2^64的GB是2^(64-30)= 2^34 = 17,179,869,184GB…18 GGB " 18gb - gb ";)

相关内容

  • 没有找到相关文章

最新更新