代码之家  ›  专栏  ›  技术社区  ›  Daniel

C++移动语义:将唯一的\u ptr引用的矩阵附加到向量

  •  1
  • Daniel  · 技术社区  · 7 年前

    我有一个 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. 将对象附加到向量而不复制它(因为它现在是右值)

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

    谢谢你的帮助!

    2 回复  |  直到 7 年前
        1
  •  1
  •   3CxEZiVlQ    7 年前

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

    是的,这是正确的。

    有几个缺点。

    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));
    
        2
  •  0
  •   Lingxi    7 年前

    你所拥有的是正确的。但仍有改进的余地。明确地

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

    这会立即释放指针。这意味着moved from对象未初始化(调用析构函数),存储将立即释放。这可能会带来一些性能上的好处(讨论了相同的论点 here 适用)。