Переместить семантику и оператор + перегрузка - PullRequest
0 голосов
/ 15 января 2020

Мне дан простой класс 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;
}

1 Ответ

5 голосов
/ 15 января 2020

Ваш тип CTab не может получить ничего от возможности перейти от своих аргументов к operator+. Вывод любой операции + должен будет создать новый CTab, который будет суммой размеров ее аргументов. Это означает выделение новой памяти для этого нового объекта, а не возможность заимствовать память у одного из аргументов.

Так что вам нужно просто взять const & для параметра и двигаться дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...