C++ 移动语义:将 unique_ptr 引用的矩阵附加到向量

C++ Move Semantics: appending the matrix referenced by a unique_ptr to a vector

我有一个 Armadillo 矩阵被 unique_ptr 引用。我想将此矩阵附加到矩阵向量,而不复制基础数据。

到目前为止,我有以下内容:

std::unique_ptr<arma::mat> m = ...; // Assume this is populated somewhere
std::vector<arma::mat> vec;
vec.push_back(std::move(*m));

我认为这将执行以下操作:

  1. 访问底层 arma::mat 对象 (*m)
  2. 使该对象成为右值 (std::move)
  3. 将对象附加到向量而不复制它(因为它现在是右值)

这是正确的,还是我错过了什么?

感谢您的帮助!

Is this correct, or did I miss something here?

是的,没错。

有几个缺点。

  1. 在最后一点 m 引用了一个死对象。访问它可能很危险。
  2. arma::mat 类型的对象足够重。查看小型向量和矩阵的封装本地存储。它禁用小矩阵和向量的移动语义。
  3. 调整 std::vector<arma::mat> 的大小,对其元素进行操作,由于小对象的本地存储相同,因此很重要。

我更喜欢下面这样的代码

std::unique_ptr<arma::mat> m = ...; // Assume this is populated somewhere
std::vector<std::unique_ptr<arma::mat>> vec;
vec.push_back(std::move(m));

你所拥有的是正确的。但仍有改进的余地。具体来说,

vec.push_back(std::move(*std::exchange(m, nullptr)));

这会立即释放指针。这意味着 moved-from 对象未初始化(调用析构函数),并在现场释放存储空间。这可能会提供一些性能优势(讨论的相同论点 here 适用)。