如何在犰狳中共享公共内存?
How to share common memory in armadillo?
在犰狳中,高级构造函数提供了像
一样共享内存的方式
mat B(10,10);
mat A(B.memptr(),2,50,false, true);
但是关于class的c++程序,应该先在头文件中声明变量,比如
mat A,B;
并在cpp文件中实现其他东西
所以,谁能告诉我如何在头文件中声明 mat A 和 B 的情况下在 cpp 文件中的 mat A 和 mat B 之间共享内存?
您可以在声明 class 时将 B
矩阵声明为对 A
矩阵的引用。例如:
class foo
{
public:
mat A;
mat& B; // alias of A
foo()
: B(A) // need to initialize the reference as part of the constructor
{
A.zeros(4,5);
A(1,1) = 1;
B(2,2) = 2;
A.print("A:");
B.print("B:");
}
};
另一种(更脆弱的)解决方案是使用公共矩阵,然后使用 C++11 std::move() 将内存分配给其他矩阵。例如:
#include <utility>
#include <armadillo>
using namespace std;
using namespace arma;
int main()
{
mat C(4,5, fill::zeros); // C is the common matrix
mat A:
mat B;
A = std::move( mat(C.memptr(), C.n_rows, C.n_cols, false, false) );
B = std::move( mat(C.memptr(), C.n_rows, C.n_cols, false, false) );
// note: in the above, the last argument of 'false' is important
A(1,1) = 1;
B(2,2) = 2;
// A and B will both have 1 and 2 as they're using the same memory
A.print("A:");
B.print("B:");
}
如果您使用的是 gcc 或 clang,则可以使用 -std=c++11
开关启用 C++11 模式。
对比 2013,
#define ARMA_USE_CXX11
应该包括在内。然后 std::move 就可以了。
感谢 hbrerkere 指导正确的方法。
在犰狳中,高级构造函数提供了像
一样共享内存的方式mat B(10,10);
mat A(B.memptr(),2,50,false, true);
但是关于class的c++程序,应该先在头文件中声明变量,比如
mat A,B;
并在cpp文件中实现其他东西
所以,谁能告诉我如何在头文件中声明 mat A 和 B 的情况下在 cpp 文件中的 mat A 和 mat B 之间共享内存?
您可以在声明 class 时将 B
矩阵声明为对 A
矩阵的引用。例如:
class foo
{
public:
mat A;
mat& B; // alias of A
foo()
: B(A) // need to initialize the reference as part of the constructor
{
A.zeros(4,5);
A(1,1) = 1;
B(2,2) = 2;
A.print("A:");
B.print("B:");
}
};
另一种(更脆弱的)解决方案是使用公共矩阵,然后使用 C++11 std::move() 将内存分配给其他矩阵。例如:
#include <utility>
#include <armadillo>
using namespace std;
using namespace arma;
int main()
{
mat C(4,5, fill::zeros); // C is the common matrix
mat A:
mat B;
A = std::move( mat(C.memptr(), C.n_rows, C.n_cols, false, false) );
B = std::move( mat(C.memptr(), C.n_rows, C.n_cols, false, false) );
// note: in the above, the last argument of 'false' is important
A(1,1) = 1;
B(2,2) = 2;
// A and B will both have 1 and 2 as they're using the same memory
A.print("A:");
B.print("B:");
}
如果您使用的是 gcc 或 clang,则可以使用 -std=c++11
开关启用 C++11 模式。
对比 2013,
#define ARMA_USE_CXX11
应该包括在内。然后 std::move 就可以了。
感谢 hbrerkere 指导正确的方法。