【问题标题】:if size_t is 64 bits what is the maximum size of a char array?如果 size_t 是 64 位 char 数组的最大大小是多少?
【发布时间】:2015-12-21 05:56:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我强烈建议您购买一个新计算器。检查SIZE_MAX。
  • (2^64 个地址)/(10^9 个地址/GB) = 1.8e10 GB...您最多有 18 万亿 GB 的存储空间,而不是 18万亿字节。这等于 18 艾字节。经常检查你的单位!
  • According to Google 2^64 字节 = 17179869184 gibibytes。正如@Olaf 所说,SIZE_MAX 确定了size_t 的最大值。此外,在 C 中,char 始终是一个字节。这个名字只是历史的不幸。
  • @Kninnug:只是补充一点,一个字节可能超过 8 位。
  • @Olaf 好点,虽然(目前)这在笔记本电脑中并不常见。

标签: c memory out-of-memory size-t


【解决方案1】:

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

(它是 17 而不是 18,因为在这种情况下,前缀“kilo”、“mega”、“giga”等表示 1024 的幂,而不是 1000 的幂。近年来,binary prefixes 已被引入明确地代表了 1024 的幂,但尚未广泛使用。)

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

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

在具有 32 位 size_t 的系统上,最大理论对象大小约为 4 GB,而在现代系统上,这可能是一个实际限制。使用 64 位 size_t,鉴于现代计算机技术,实际限制几乎肯定会受到其他因素的影响。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 啊,我的数学很差。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 2013-01-09
      • 2021-05-07
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多