C++ c++;标准::错误的分配,约200000x6双记录
我有一个MATLAB代码,它在20000000×6个双记录上运行良好 我将相同的代码转换为cC++并使用vector来存储这些记录,但它给了我一个问题 这是我的结构:C++ c++;标准::错误的分配,约200000x6双记录,c++,matlab,heap,heap-memory,records,C++,Matlab,Heap,Heap Memory,Records,我有一个MATLAB代码,它在20000000×6个双记录上运行良好 我将相同的代码转换为cC++并使用vector来存储这些记录,但它给了我一个问题 这是我的结构: typedef struct Affine { double a11; double a12; double a13; double a21; double a22; double a23; }; 我有一个向量存储对configs的初始猜测,名为configs,它保存20000000个×Affine记录
typedef struct Affine
{
double a11;
double a12;
double a13;
double a21;
double a22;
double a23;
};
我有一个向量存储对configs的初始猜测,名为configs,它保存20000000个×Affine
记录
我必须把这些记录变成仿射的,我像这样创建的
Affine affines;
affines.a11 = 0;
affines.a12 = 0;
affines.a13 = 0;
affines.a21 = 0;
affines.a22 = 0;
affines.a23 = 0;
vector<Affine> matrixConfigs_mex(configs.size(), affines);
什么操作系统?什么编译器?什么命令行?@Mudasar请发布一个复制问题的命令行。链接显示向量中的20000000
Affine
对象没有问题。那么您创建了两个向量?那是2GB的,而且是。我猜是操作系统限制了你的程序分配这么多内存。例如,它没有两个连续的1GB内存块,或者你超过了提供给进程的空间(2GB)。每个向量是960MB,一个32位进程有2GB的虚拟地址空间;它们不适合(特别是因为std::vector
需要连续内存,并且虚拟地址空间包含向量之外的其他内容)。事实上,您有10GB的RAM是完全不相关的,这里限制您的是虚拟地址空间的大小,它是固定的。克服此问题并利用RAM的最简单方法是以64位模式编译程序。
// Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x86
#include <vector>
#include <iostream>
struct Affine
{
double a11;
double a12;
double a13;
double a21;
double a22;
double a23;
};
int main()
{
Affine affine;
affine.a11 = 0.1;
affine.a12 = 0.1;
affine.a13 = 0.1;
affine.a21 = 0.1;
affine.a22 = 0.1;
affine.a23 = 0.1;
std::vector<Affine> test1(20000000, affine);
std::vector<Affine> test(test1.size(), affine);
std::cout << test[10000].a11;
}