【发布时间】:2011-01-29 04:47:02
【问题描述】:
从previous question relating to heap usage restrictions 开始,我正在寻找一个良好的标准 C++ 类,用于以一种既节省内存又提高速度的方式处理大型数据数组。我一直在使用单个 malloc/HealAlloc 分配数组,但在多次尝试使用各种调用后,不断遇到堆碎片。因此,除了移植到 64 位之外,我得出的结论是使用一种机制,该机制允许我拥有一个跨越多个较小内存片段的大型数组。我不希望每个元素分配一个 alloc,因为这样内存效率非常低,因此计划编写一个覆盖 [] 运算符的类并根据索引选择适当的元素。是否已经有一个像样的课程可以做到这一点,还是我最好自己动手?
根据我的理解,以及一些googling,理论上一个 32 位的 Windows 进程应该能够寻址高达 2GB。现在假设我安装了 2GB,并且各种其他进程和服务占用了大约 400MB,您认为我的程序可以合理地期望从堆中获得多少可用内存?
我目前正在使用各种风格的 Visual C++。
编辑根据 Poita 的帖子,我尝试了 std::deque,在 VS2008 上使用以下测试;
#include <deque>
using namespace std;
struct V
{
double data[11];
};
struct T
{
long data[8];
};
void dequeTest()
{
deque<V> VQ;
deque<T> TQ;
V defV;
T defT;
VQ.resize(4000000,defV);
TQ.resize(8000000,defT);
}
上述数据的总内存为 608MB,如果我使用直接 malloc 或 HeapAlloc,则需要
我想是时候编写我自己的大数组类了。
第二次编辑:分配较小的金额立即使用以下内容产生 1.875GB;
#define TenMB 1024*1024*10
void SmallerAllocs()
{
size_t Total = 0;
LPVOID p[200];
for (int i = 0; i < 200; i++)
{
p[i] = malloc(TenMB);
if (p[i])
Total += TenMB; else
break;
}
CString Msg;
Msg.Format("Allocated %0.3lfGB",Total/(1024.0*1024.0*1024.0));
AfxMessageBox(Msg,MB_OK);
}
最终编辑 我决定接受 Poita 的帖子和各种 cmet紧随其后的 cmets。这应该很容易通过 O(1) 随机元素访问来实现,基于每个块的固定数量的元素,这正是我所需要的。感谢大家的反馈!
【问题讨论】:
-
我希望这些“口味”都不是VC6.0
-
虽然我还有 VC6.0,但将它用于一些事情,而不是任何接近发布阶段的事情。主要是 VS2008,一些 VS2003,和一些 EVC++ 4.0,这就是为什么我也维护一个 VC6.0。
-
一个 32 位的 windows 程序可以分配超过 2GB 的内存,你只是不能同时映射所有的内存。 - blogs.msdn.com/oldnewthing/archive/2004/08/10/211890.aspx
标签: c++ arrays visual-c++