C 移动语义:将唯一_ptr引用的矩阵附加到向量

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

本文关键字:向量 引用 ptr 语义 移动 唯一      更新时间:2023-10-16

我有一个由 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. 使此对象成为rvalue(std::move(
  3. 将对象附加到矢量而不复制它(因为现在是rvalue(

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

谢谢您的帮助!

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

是的,这是正确的。

有几个缺点。

  1. 在最后一点m指的是一个已故的物体。访问它可能很危险。
  2. 类型arma::mat的对象足够沉重。查看封装的本地存储,以获取小型矢量和矩阵。它禁用小矩阵和向量的语义。
  3. 调整 std::vector<arma::mat>的大小,用元素操纵,由于小物体的本地存储而变得重量。

我更喜欢像Bellow

这样的代码
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)));

这立即发布指针。这意味着将移动的对象是非专业化的(称为destructor(,而存储在现场进行交易。这可能会提供一些性能好处(此处讨论的相同论点适用(。