是什么决定了可以分配多少内存?

这是我之前关于为什么size_t是必要的问题的后续跟进。

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

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

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

malloc不需要能够使用操作系统可以给他的所有内存。 操作系统不需要提供机器中存在的所有内存(例如, 出于许可原因 ,各种版本的Windows Server具有不同的最大内存)

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

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

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