繁体   English   中英

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

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

我已经看到几个接近这个的答案,但不是一个具体的答案。

如果 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是 2 64 -1,或 18446744073709551615。这有点超过 18 艾字节,或大约 170 亿千兆字节。

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

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

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

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

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

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

你的数学错了。 是的,2^64 大约是 18 个 quintillion 地址......但是你除以 10^9 时出错了。 正如您在开头所指出的,您没有 18 GB 的地址,而是 180 亿 GB - 18 个 quintillion 地址。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM