如何在犰狳中共享公共内存?

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 指导正确的方法。