c++ - 如何使用 std::move() 将 char[] 移动到 vector<char>

标签 c++ c++11

我正在尝试连接两个字符数组 char a[9000]; char b[9000]到容器 std::vector<char> .由于数组大小不小。我正在尝试使用 std::move()

class obj
{
public:
obj &operator <<(char *&&ptr)
        {
            //???
            ptr = nullptr;
            return *this;
        }
private:
    std::vector<char> m_obj;
};

所以在main函数中

int main()
{
    obj o;
    enum {SIZE=9000};
    char a[SIZE]; memset(a, 1, SIZE);
    char b[SIZE]; memset(b, 2, SIZE);
    o << a << b;
    return 0;
}

我的问题是移动 char* 的正确方法是什么?


环境:
Ubuntu 16.04.4 LTS
g++ 5.4.0

最佳答案

tl;博士

调用 reserve() 并复制。

搬家有什么问题?

几件事。首先,您似乎对 std::move 的期望是错误的。 std::move 不会神奇地移动任何东西(或移动任何东西,包括非魔法)。它所做的是转换为右值引用,这可能启用在某些条件下移动。

其次,从 C++03 开始​​,std::vector 保证其元素在内存中连续布局(在 C++03 之前,它实际上是无论如何,但没有给出明确的保证)。如果您使用 std::move,那么您必须使用晚于 C++03 的版本,因此 std::vector 必须连续布置其元素。
这意味着除了两个数组碰巧彼此相邻的完全巧合的情况外,没有办法在不复制的情况下将两个数组的元素放入 vector 中。根本不可能移动它们,因为至少必须重新定位(= 复制)一个数组。

此外,我无法想象如何按照您打算的方式从数组中移动元素。移动假定您接管所有权,这通常意味着您以某种方式修改移出的对象,使其仍然有效,但没有它以前拥有的任何资源。
您如何使用在周围范围内具有自动存储持续时间的数组来做到这一点?移动后取消引用数组(这是可能且合法的)将要做什么?

此外,您希望将数组衰减为指针(这是完全合法的),然后以某种方式神奇地移动。然而,这并没有移动数组的内容!您最多只能移动指针,但这没有任何意义,因为移动指针与复制指针相同。

您无法避免必须复制数组元素,但您可以通过提前正确调用 reserve() 来节省一次内存分配和一次不必要的复制。

关于c++ - 如何使用 std::move() 将 char[] 移动到 vector<char>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45616132/

相关文章:

c++ - 预处理器字符串化宏不起作用

c++ - 从 Cascade QML 调用 C++ 函数

c# - 用于检索基础类型的空类

c++ - 通过 r 值引用接收后通过引用传递

c++ - 从 vector 复制到 C++ 11 中的结构

java - 在 Ubuntu Linux 中查找 C/C++ 源代码的最佳工具是什么?

c++ - 如何从模板访问模板类的静态?

c++ - 从另一个模板函数中调用模板函数时收到 'expected primary-expression'

C++11 通过推导类型参数传递成员函数调用?

c++ - 从实现中解耦类型特征定义