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

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

我看到了几个与此接近的答案,但没有看到具体的答案。

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

18GB 真的是 64 位机器上字符数组/字符串的限制吗?还是我在推理中遗漏了一些东西?

我正在学习我的第一门真正的计算机科学类(class),所以如果我的理解有任何严重错误,请原谅。

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

最佳答案

如果 size_t 为 64 位,则(假设没有填充位)SIZE_MAX 为 264-1,即 18446744073709551615。这有点多超过 18 艾字节,即约 170 亿千兆字节。

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

是的,这意味着 264-1 是程序可以创建的任何对象的大小的上限。 (标准中存在一些含糊之处,但其目的是 size_t 可以表示任何对象的大小。)

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

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

关于c - 如果 size_t 是 64 位,那么 char 数组的最大大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32747645/

相关文章:

c - 为什么 "Line buffer stdout to ensure lines are written atomically and immediately"

c - Eclipse 上的 SDL 问题

c - C如何保护指针内存?

python - 如何解决这个内存错误 - python

c - malloc库如何判断发生了越界访问?

linux - 为什么Linux中的物理内存是线性增加而不是一次性分配的?

.net - 抛出了 'System.OutOfMemoryException' 类型的异常

java - 如何在java中下载没有内存问题的大文件

c# - 管理大量数据(高度数据)并替换这个巨大数组的最有效方法是什么?

c - 为数组中的行赋值 - C 编程