C 移动语义:将唯一_ptr引用的矩阵附加到向量
C++ Move Semantics: appending the matrix referenced by a unique_ptr to a vector
我有一个由 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
( - 使此对象成为rvalue(
std::move
( - 将对象附加到矢量而不复制它(因为现在是rvalue(
这是正确的,还是我在这里错过了什么?
谢谢您的帮助!
这是正确的,还是我在这里错过了什么?
是的,这是正确的。
有几个缺点。
- 在最后一点
m
指的是一个已故的物体。访问它可能很危险。 - 类型
arma::mat
的对象足够沉重。查看封装的本地存储,以获取小型矢量和矩阵。它禁用小矩阵和向量的语义。 - 调整
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(,而存储在现场进行交易。这可能会提供一些性能好处(此处讨论的相同论点适用(。
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 创建引用向量的优雅方式
- C++重新引用向量中的值
- 很好的语法来获取对向量/数组数据的大小引用?
- 如何返回向量的常量引用?
- 取消引用向量时出现问题
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 通过引用传递向量是请求 std::分配器
- 从类返回引用向量
- 返回两个向量 – 使用引用还是元组?
- 在C++中通过引用传递向量数组
- 引用向量中的特定索引
- 如何告诉自动推断向量<bool>元素的非引用类型
- 如何在方法主体中返回声明向量的引用?
- 向量引用C++
- 在向量引用上调用 vector::reserve()
- 如何创建一个同时接受数组和向量引用的函数模板
- 如何做列表的向量引用列表中的值
- c++向量引用转换
- 最方便的表示向量引用的向量的方法