c ++动态内存分配限制

时间:2012-06-25 22:56:28

标签: c++ memory dynamic limit allocation

在C ++中使用new或malloc进行动态分配是否存在任何限制,系统或其他类型? 系统是64位,我想分配一个约800万个结构的数组。

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

运行我自己的测试后,我可以分配800万个元素,但是当我达到~8.0亿时,malloc会返回NULL。该结构包含7个浮点数,因此总大小约为22GB。 这种看似随意的限制背后的原因是什么?这台机器有4GB的内存和4GB的虚拟内存,所以我不确定为什么我甚至可以分配那么多。

3 个答案:

答案 0 :(得分:3)

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

“bitness”只是表明你所针对的操作系统和体系结构,我还要强调一个事实,即支持C ++程序的每个操作系统都有自己的标准C ++库实现(如果你使用的是std库)并且作为编码器,您只是使用属于std库的头文件和命名空间,并且您依赖于操作系统通常附带的C / C ++库来实际运行您的代码。

我还建议依赖测试部分并将内存的使用保持在最低限度,某些操作系统也有一些反溢出技术或类似的东西,所以一些操作系统可以看到你的大量分配作为威胁系统稳定性,RAM的大量使用也对内存控制器起着很大的作用,就像在X86架构中一样,通常你要做的事情并不是一件好事而且结局不好或最终得到一台真正特定的机器和操作系统是您尝试创建的此应用程序的最爱目标。

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

malloc()是来自C世界的函数,也涉及直接内存管理,如直接分配和解除分配,你的硬件也必须执行很多,我的意思是,很多

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

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

答案 1 :(得分:2)

限制大约是你的自由ram加上允许交换到磁盘的空间。 对于创纪录的8亿字节= 800 Mb,所以你可能会安全地坐在小结构上,甚至可能不需要交换(并且应该避免) 试试吧,看看它崩溃的地方;-)

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

32位:2 ^ 32 =大约4千兆字节,所以即使在这里你也可以安全起见

对于有符号值除以2,至少在64位系统上还有很多空间

答案 2 :(得分:0)

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