【发布时间】:2013-09-20 16:08:11
【问题描述】:
我在 C++ 中使用 Armadillo 库来存储/计算大型矩阵。我的理解是应该动态地(在堆上)存储大型数组/矩阵。
假设我声明一个矩阵
mat X;
并将大小设置为(例如)500 行,500 列,随机条目:
X.randn(500,500);
尽管没有使用new 或delete,犰狳是否会动态存储X(即在堆上)?我问的原因是,似乎犰狳允许我将变量声明为:
mat::fixed<n_rows, n_cols>
其中,我quote:“一般比动态内存分配要快,但是以后不能(直接或间接)改变矩阵的大小”。
不管上述情况——我应该使用这个吗:
mat A;
A.set_size(n-1,n-1);
或者这个:
mat *A = new mat;
(*A).set_size(n-1,n-1);
其中 n 介于 1000 或 100000 之间,并且事先不知道。
【问题讨论】:
-
100000*100000*4大约 40 GB,这可能需要虚拟内存并带来一大堆问题。 -
一般我建议不要使用指针,因为它们很容易出错:它们经常导致内存泄漏或内存损坏。指针通常只在经过良好测试的库中有用,而不是在用户代码中。将对象传递给函数时,最好使用引用。要存储一组对象,请使用包含指针的 C 数组的容器类 instead。