C++ 动态内存分配限制

c++ dynamic memory allocation limit

本文关键字:分配 内存 动态 C++      更新时间:2023-10-16

对于C++中新的或malloc的动态分配,是否有任何类型的限制,系统或其他限制?系统是 64 位的,我想分配一个大约 ~8 亿个结构的数组。

编辑:我之前没有自己测试它的原因是因为我目前无法访问具有足够内存的机器,所以我觉得在我当前的机器上测试它没有意义。

运行我自己的测试后,我可以很好地分配 8 亿个元素,但是一旦我达到 ~8.5 亿个元素,malloc 就会返回 NULL。该结构包含 7 个浮点数,因此总大小约为 22GB。这个看似任意的限制背后的原因是什么?这台机器有 4GB 的内存和 4GB 的虚拟内存,所以我不确定为什么我什至能够分配这么多。

除了尝试运行代码之外,没有办法告诉您。

"位"只是表示您面向的操作系统和架构,我还想强调这样一个事实,即支持C++程序的每个操作系统都是标准C++库的实现(如果您使用的是 std 库),作为编码人员,您只是使用属于 std 库的标头和命名空间,并且您依赖于通常随操作系统提供的 C/C++ 库实际运行您的代码。

我还建议依靠测试部分并将内存的使用保持在最低限度,某些操作系统还具有一些防溢出技术或类似的东西,因此某些操作系统可以将您的大量分配视为对系统稳定性的威胁,大量使用 RAM 也涉及内存控制器的重要作用,就像在 X86 架构中很正常一样, 通常,您要做的不是一件好事,而是以坏事告终,或者最终将一台非常特定的机器和操作系统作为您尝试创建的此应用程序的首选目标。

最后,您正在尝试编写 C 代码而不是C++代码!

malloc()是来自 C 世界的功能,还涉及直接内存管理,如直接分配和取消分配,您的硬件还必须执行很多操作,我的意思是,很多具有 ~8 亿结构的间接操作。

我建议切换到真正的C++结构,如 std 向量(性能优于列表),或者只是切换到具有自己的垃圾收集器且没有直接内存管理阶段的语言,如 C# 或 Java。

您的问题的答案是否定的,从实用的角度来看,您将面临有关优化代码的大问题,并且可能,我说可能会,使用不同的语言(如 C++或 C# 或 Java)您的生活会更轻松,但请记住,通常垃圾收集器会占用大量内存,在您的情况下,最好的解决方案可能是 C++ 需要一点额外的努力和测试阶段你。

限制大约是您的可用内存加上允许交换到磁盘的空间。对于创纪录的 8 亿字节 = 800 Mb,因此您可能使用小结构可以很好地坐在安全的一面,甚至可能不需要交换(并且应该避免)只需尝试一下,看看它在哪里崩溃;-)

64 位:2^64/2^30 = 大约 17* 10⁹ 千兆字节(对于字节可寻址架构,1Gb=2^30 位),所以这里不用担心

32 位:2^32 = 大约 4 GB 所以即使在这里你也可以安全

除以 2 表示有符号值,至少在 64 位系统上您仍然有很多空间

对于动态分配,应用与静态分配相同的限制。 例如,您仅限于可用内存量(受指针大小的限制)。32 位和 64 位系统之间的主要区别在于指针的大小,在 32 位系统上,您只能使用 32 位指针,例如可以访问 4294967296 字节 (4GB)。系统保留了其中的一部分,因此最终约为 2,5 GB。在 64 位系统上,它的方式更多,2^64 = 16 EB,实际上大约 256 TB 到 4 PB。比你需要的要多得多。如果您没有足够的内存(并且没有足够的交换空间),它可能会崩溃。