【问题标题】:What determines how much memory can be allocated?什么决定了可以分配多少内存?
【发布时间】:2011-10-21 14:01:01
【问题描述】:

这是my previous question 关于为什么需要 size_t 的后续行动。

鉴于 size_t 保证足够大以表示您可以分配的内存块的最大大小(意味着仍然可以有一些大于 size_t 的整数),我的问题是......

什么决定了你一次可以分配多少?

【问题讨论】:

  • 看看我对你的问题所做的更正
  • 操作系统。这些只是一些额外的字符,因为评论不够长。
  • @xanatos 所以 size_t 实际上可以比它需要的更大吗?
  • @Paul 是的。正如我在另一篇文章中所说,在 Windows Server 2008 R2 上,你不能真正分配 64 位内存(就像你不能在 Windows 32 位上分配 4 GB 内存一样),仍然是size_t是 64 位和 32 位长。它们通常四舍五入(通常是处理器的字长,32 位或 64 位)

标签: c memory-management size-t


【解决方案1】:

您的机器架构、操作系统(但两者是交织在一起的)和您的编译器/库集决定了您一次可以分配多少内存。

malloc 不需要需要 能够使用操作系统可以提供给他的所有内存。操作系统需要让机器中的所有内存都可用(例如不同版本的 Windows Server 有不同的最大内存for licensing reasons

但请注意,操作系统可以提供比机器中的内存更多的内存,甚至比主板允许的内存更多(假设主板有一个内存插槽,只接受 1gb 的记忆棒,Windows 仍然可以让程序分配 2gb 的内存)。这是通过使用虚拟内存、分页(你知道,交换文件,你的老朋友 :-) 或者,例如,通过使用 NUMA 来完成的。

【讨论】:

  • 内存碎片也会影响该值。
  • @xappymah 更复杂...分配空间碎片(在保护模式下)通常比实际内存碎片更早地影响。在具有 3 gb ram 的 Win 32 上,不可能分配一个 2gb 的块,而且通常甚至分配一个 5-700 mb 的块也很复杂(我知道这一点是因为我试图映射 CD 的 iso)
【解决方案2】:

在实际代码中我能想到三个约束:

  • 最大的 unsigned int size_t 能够分配。 size_t 应该是操作系统的内存分配机制正在使用的相同类型(相同大小等)。
  • 操作系统能够在 RAM 中处理的最大块(如何表示块的大小?这种表示如何影响最大块大小?)。
  • 内存碎片(最大的可用块)和可用的总可用 RAM。

【讨论】:

  • Memory fragmentation (largest free block) 在保护模式下它是最大的可用虚拟地址空间。
猜你喜欢
  • 2014-03-02
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2011-01-03
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多