std :: bad_alloc:确定Eigen中的缓冲区大小

时间:2015-01-09 15:13:46

标签: c++ size buffer eigen bad-alloc

我使用Eigen的矩阵格式来读取先前获得的多维数据:

Eigen::Matrix<unsigned long long, Eigen::Dynamic, 12> dummyData;

以及稍后了解我的数据大小后:

dummyData.resize(PackSize, 12);

PackSize可以按6e08的顺序排列。为了避免在计算缓冲区大小时出现整数溢出,我使用unsigend long long来解决win32上的(PackSize* 12*8) mod (2^32)问题。然而,我提出:Unhandled exception at 0x75362F71 in DataRead.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x004CBCF0。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我不完全确定您希望将unsigned long long作为Matrix的标量类型;从数学角度讲,矩阵应该在字段上定义,你必须要知道,如果你试图找到正整数的乘法逆,你就不会对你很容易理解环(即无符号整数,你必须乘以你的无符号整数获得1)的整数。

然而,这在Eigen中是合法的,所以我们只会坚持下去 - 也许你不想对需要这些属性的矩阵进行操作。

所以,你说你使用win32(这是Windows API),但不是你的操作系统是32位还是64位。如果您运行的是32位窗口,则任何进程都不能拥有超过2GB的虚拟地址空间,并且分配超过2GB / sizeof(long long)的无符号long long将无效。现在,long long是64bit = 8Byte,因此每2GB可以拥有的最大uint64_t数是134217728;现在,您希望将它们放在12列的行中,最多留下11,184,810行(忽略了您的数字不是进程内存中唯一的数字)。现在,11e6&lt; 6e8,你必须考虑到你不知道Eigen试图使用哪种类型的分配器这一事实,实际上可能会尝试分配超过必要的分配器。

但最有可能的是,您的12列格式也会被填充到更好的对齐位置。 Eigen文档对此并不太具体,我认为实际的实现取决于你的Eigen库是如何编译的,所以我通常不能很好地建议你。您可以尝试使用Eigen :: Matrix模板中的DontAlign选项。