我得到了一个简单的 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)
您的CTab类型无法从其参数移动到operator+. 任何+操作的输出都必须创建一个新的CTab,它是其参数大小的总和。这意味着为这个新对象分配新内存,而不是能够从参数之一借用存储。
所以你应该只const &对参数取 a并继续。
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |