size_t
只需要足够大以存储最大可能的单个连续对象。这可能与地址空间的大小不同(例如,在具有分段内存模型的系统上)
但是,在具有平坦内存空间的普通平台上,两者是相等的,因此size_t
如果您知道目标 CPU,则可以在实践中使用。
无论如何,这并没有真正告诉你任何有用的东西。当然,32 位 CPU 有 4GB 内存空间,size_t
32 位无符号整数也是如此。但这并没有说明您可以分配多少。操作系统使用了部分内存空间。您自己的应用程序已经使用了某些部分:用于将可执行文件映射到内存(以及它可能使用的任何动态库)、每个线程的堆栈、在堆上分配的内存等等。
所以不,诸如获取大小之类的技巧会size_t
告诉您一些有关您正在运行的地址空间的信息,但没有什么非常有用的。您可以询问操作系统您的进程和其他指标使用了多少内存,但同样,这对您没有多大帮助。一个进程可能只使用几兆字节,但是如果将其分布在如此多的小分配上,以至于不可能找到大于 100MB 的连续内存块。因此,在 32 位机器上,进程几乎不使用内存,您不太可能进行这样的分配。(即使操作系统有一个神奇的WhatIsTheLargestPossibleMemoryAllocationICanMake()
API,它仍然对你没有帮助。它会告诉你从刚才开始你需要什么. 您无法保证在您尝试映射文件时答案仍然有效。
所以真的,你能做的最好的就是尝试映射文件,看看它是否失败。