Мне дан простой класс 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 ";
}
Что касается потребностей семантики перемещения, я также написал конструктор перемещения:
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 ";
}
Ранее мне было предложено перегрузить оператор '+', чтобы он возвращал конкатенацию из 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;
}