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));
我认为这将执行以下操作:
- 访问底层
arma::mat
对象 (*m
)
- 使该对象成为右值 (
std::move
)
- 将对象附加到向量而不复制它(因为它现在是右值)
这是正确的,还是我错过了什么?
感谢您的帮助!
Is this correct, or did I miss something here?
是的,没错。
有几个缺点。
- 在最后一点
m
引用了一个死对象。访问它可能很危险。
arma::mat
类型的对象足够重。查看小型向量和矩阵的封装本地存储。它禁用小矩阵和向量的移动语义。
- 调整
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 适用)。
我有一个 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));
我认为这将执行以下操作:
- 访问底层
arma::mat
对象 (*m
) - 使该对象成为右值 (
std::move
) - 将对象附加到向量而不复制它(因为它现在是右值)
这是正确的,还是我错过了什么?
感谢您的帮助!
Is this correct, or did I miss something here?
是的,没错。
有几个缺点。
- 在最后一点
m
引用了一个死对象。访问它可能很危险。 arma::mat
类型的对象足够重。查看小型向量和矩阵的封装本地存储。它禁用小矩阵和向量的移动语义。- 调整
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 适用)。