编辑:我之前为什么没有自己测试它,是因为我目前没有足够内存的机器,所以我觉得在我的当前机器上测试没有意义。
经过我的测试,我可以成功地分配800万个元素,但是一旦达到约850万个,malloc会返回NULL。每个结构体包含7个浮点数,因此总大小约为22GB。 这个看似随意的限制背后的原因是什么?这台机器有4GB的RAM和4GB虚拟内存,所以我不确定我甚至能够分配那么多。
除了运行代码,没有其他方法告诉你这个问题的答案。
"位数"只是指定你要针对的操作系统和架构,我还想强调一点,支持C++程序的每个操作系统都有自己的标准C++库实现(如果你正在使用std库),作为编码人员,你只是使用属于std库的头文件和命名空间,并依赖于通常随操作系统提供的C/C++库来实际运行你的代码。
我还建议依靠测试部分并将内存使用保持在最小限度,一些操作系统还具有一些反溢出技术或类似技术,因此一些操作系统可能会将您的大量分配视为对系统稳定性的威胁,RAM的重度使用也涉及内存控制器的重要角色,就像在X86架构中一样,通常你尝试做的事情不是好事,最终会以一个非常特定的机器和操作系统作为你尝试创建的应用程序的首选目标而告终。
最后,你正在尝试编写C代码而不是C++代码!
malloc()
是来自C世界的函数,它还涉及直接内存管理,如直接分配和释放,你的硬件也必须执行大量的间接操作,我是说,非常多,与 ~800百万个结构体。
我建议切换到一个真正的C++结构,如std vector(性能比list更好),或者切换到一种具有自己的垃圾回收器且没有直接内存管理阶段的语言,如C#或Java。
你的问题的答案是否定的,从实用角度来看,你将面临一个关于优化代码的大问题,可能,我说可能,使用不同的语言如C++、C#或Java会让你的生活更轻松,但请记住,垃圾回收器通常需要大量内存,对于你的情况,最好的解决方案可能是在你进行额外的努力和测试阶段后选择C++。
对于动态分配,与静态分配相同的限制适用。例如,您只受可用内存量的限制(由指针大小限制)。 32位和64位系统之间的主要区别是指针的大小,在32位系统上,您只能使用32位指针,例如可以访问4294967296字节(4GB)。 系统保留其中一些,因此最终大约为2.5 GB。 在64位系统上,它更多,2 ^ 64 = 16 exabyte,在实践中为256 terabyte至4 petabyte。比您需要的要多得多。 如果您没有足够的内存(和交换空间),可能会崩溃。