首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++Builder中分配大型数组

在C++Builder中分配大型数组
EN

Stack Overflow用户
提问于 2017-03-16 09:42:52
回答 2查看 639关注 0票数 0

我在Borland C++Builder 6中工作,必须创建一个13230 x 26460的double值数组。

该矩阵大小具有350065800元素,并且它占用内存的350065800 * 8 bytes = 2800526400 bytes = 2.6GB

我使用的是64位Windows和8 8GB内存。

即使我在图像标志选项(GF)中设置了LARGEADDRESSAWARE标志,它也不能声明数组。

在Borland C++Builder中有没有其他方法来声明一个2.6GB大小的数组?

EN

回答 2

Stack Overflow用户

发布于 2017-03-16 14:37:26

您不能将8 GByte作为BCB6中的单个阵列!出现这种情况的原因很少:

  1. You的目标是32位应用程序

因此您操作系统或仿真器不能处理超过2或4 GB的内存。这意味着无论你做什么,8 8GB都是毫无疑问的。是的,即使你有x64操作系统,你的32位应用程序也是在WoW64模拟器中运行的……

  1. Borland allocation new 无法分配超过1 GB的单个区块

不知道为什么,因为限制应该接近2 GB或4 GB,但至少对我来说,略高于的1 GB(即使有超过2 GB的空闲WoW64)是安全分配的最大限制。可能从旧版本继承了Borland内存管理器的限制。此行为是在BDS2006上测试的,因此不确定BCB6是否相同,但我认为没有理由不同,因为它们共享相同的内存管理器和相关的C++引擎错误(在BCB5 btw中不存在)。

最后,当您使用new,delete[]时,您应该检查以下内容(只是为了确保):

所以你需要把你的数组分成更多的块。因为你得到了2D矩阵,所以你可以使用,Malcolm,McLean,建议的数组。因此,如果您的数组的单元格是T,请尝试:

代码语言:javascript
复制
#define T double
T **m=new T*[13230];
for (int i=0;i<13230;i++) m[i]=new T[26460];

m[10000][20000]=1.2345; // do your stuff with m[][]

for (int i=0;i<13230;i++) delete[] m[i];
delete[] m;

只需更改数据类型的T (我使用的是double,因为它也是8字节),并添加对返回NULLnew的检查

如果你真的需要8 8GB的矩阵,你需要将它存储在文件中。或者使用64位编译器,如RAD2009或更高版本。

票数 0
EN

Stack Overflow用户

发布于 2017-04-05 01:54:38

正如雷米所说,C++ Builder6只能创建32位应用程序,该应用程序最多可以消耗2 2GB (如果您使用了32位操作系统,则为3 2GB)内存。另外,通常情况下消耗8 8GB内存也不被认为是良好的编程实践。

话虽如此,如果你真的必须这么做,你可以使用CreateFileMappingMapViewOfFile创建一个现金内存。这样,您的数据存在于磁盘上,但您可以像访问内存中的数据一样访问它。缺点是,它将是缓慢的。

代码语言:javascript
复制
HANDLE hFile = ::CreateFile(fileName, ...);
HANDLE hFM = ::CreateFileMapping(hFile, ...);
double**m= (double**)::MapViewOfFile(hFM, ...);
m[10000][20000]=1.2345; // do your stuff with m[][]
::UnmapViewOfFile((void*)m); 
::CloseHandle(hFM);
::CloseHandle(hFile);

不要忘记使用UnmapViewOfFileCloseHandle进行清理。如果你不这样做,你可能会弄乱windows的现金内存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42823855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档