移动语义和运算符 + 重载

0 c++ move-semantics

我得到了一个简单的 CTab 类,它包含诸如一维数组的指针、数组的大小和以下复制构造函数之类的字段:

CTab::CTab(const CTab &cOther)
{
    pi_tab = new int[cOther.i_size];
    i_size = cOther.i_size;
    for (int ii = 0; ii < cOther.i_size; ii++)
        pi_tab[ii] = cOther.pi_tab[ii];
    std::cout << "Copy ";
}
Run Code Online (Sandbox Code Playgroud)

关于move语义需求,我还写了move construcor:

CTab::CTab(CTab && cOther)
{
    pi_tab = cOther.pi_tab;
    i_size = cOther.i_size;
    cOther.pi_tab = NULL;
    cOther.i_size = 0;
    std::cout << "MOVE ";
}
Run Code Online (Sandbox Code Playgroud)

以前,我被要求重载“+”运算符,以便它返回 2 个数组的串联。现在,我正在努力修改使用移动语义以减少制作副本的数量。我不知道以前代码的哪一部分会产生不必要的副本,如果是这样,如何更改代码以使其满足给定任务的条件。有任何想法吗?

不使用移动语义的重载运算符:

CTab CTab::operator+(const CTab cOther)
{
    CTab newTab;
    newTab.bSetSize(i_size + cOther.i_size);
    for (int i = 0; i < i_size; i++)
        newTab.pi_tab[i] = pi_tab[i];
    for (int i = i_size; i < i_size+cOther.i_size; i++)
        newTab.pi_tab[i] = cOther.pi_tab[i - i_size];
    return newTab;
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

您的CTab类型无法从其参数移动到operator+. 任何+操作的输出都必须创建一个新的CTab,它是其参数大小的总和。这意味着为这个新对象分配新内存,而不是能够从参数之一借用存储。

所以你应该只const &对参数取 a并继续。

  • 不,(几乎)没有理由移动返回值。由于返回值优化,不会出现无副本的情况。 (5认同)