max*_*yne 8 c c++ visual-studio-2010 visual-studio
我想在我的基于Windows的软件中渲染4百万个三角形,该软件是用Visual Studio C++ 2010(在发布模式下构建)编写的.当我渲染3.9百万个三角形时,软件消耗的总RAM内存为400MB.但是当我尝试渲染4百万个三角形(仅多100K)时,系统会给我一个错误.
For Example:
Point *P = new (std::nothrow) Point[nb_triangles]; //==> "(std::nothrow)" is for catching the run time memory allocation error. (Point is X, Y, Z floats)
If(P == NULL)
message("System can't allocate this much memory."); // System gives me this error. It means the system can't reserve huge memory for this operation.
Run Code Online (Sandbox Code Playgroud)
我必须为顶点,面法线,顶点法线等分配内存.
其实我没有得到的是,我有8 GB RAM内存,(但在32位XP窗口= 3.2GB内存),软件只保留400MB,可用内存超过1 GB,但当我尝试只渲染100K三角形,它给了我一个错误.为什么它给我一个错误?因为它还有超过1 GB的可用RAM内存?
无论如何要解决这个问题,如何为我的应用程序分配所有可用内存?由于这个问题,我必须在软件中限制只是为了渲染3.9亿个三角形而且它并不好.
还有一个问题在于,c ++"new"运算符用于内存分配给我错误,c"malloc"运算符怎么样?可以"malloc"解决这个问题,这两者之间有什么不同?
请指导我.谢谢.
更新#1:
我已经尝试了很多,修改代码,删除内存泄漏等,但我不能分配超过4百万的内存.它不可能将我的整个代码更改为"向量".我不能改成"向量",我现在必须用"新"来坚持我自己的数据结构.以下是我想要分配以呈现1个对象的指针.
P = new points[10000000]; // points is the class with 3 floats X, Y, Z;
N = new Norm[10000000]; // Norm is the class with 3 floats X, Y, Z;
V = new vNorm[10000000]; // vNorm is the class with 3 floats X, Y, Z;
T = new Tri[10000000]; // Tri is the class with 3 integers v1, v2, v3;
Run Code Online (Sandbox Code Playgroud)
Han*_*ant 13
它是Windows编程的伟大神话之一,一个进程永远不会耗尽RAM.Windows是一个需求分页的虚拟内存操作系统,如果一个进程需要更多的RAM,那么操作系统会通过分页其他进程所拥有的其他内存页来腾出空间.或者流程本身,交换页面,暂时没有使用过.
任务管理器使用其默认设置报告进程的内存使用情况时,我们会鼓励这种神话.它显示工作集,RAM中进程的实际字节数.一个值,通常远小于进程分配的虚拟内存量.当OOM无法再分配虚拟内存时,进程就会在OOM上消失.Taskmgr中的另一个统计信息,VM大小值.它通常不会因为所有的VM都被使用而死掉,因为没有留下足够大的洞.SysInternals的VMMap实用程序是查看进程如何使用其地址空间的好方法.
获得更大的虚拟内存地址空间需要进行相当彻底的改革.虽然今天很容易,但只需将x64作为平台目标.64位进程具有大量可用的地址空间,仅受页面文件的最大大小限制.通过使用/ LARGEADDRESSAWARE链接器选项,只要您可以指望实际在64位操作系统上运行,您就可以在32位模式下跛行.这样可以在64位操作系统上将VM大小从2 GB增加到4 GB.