У меня есть функция, которая возвращает вектор класса:
vector<movement> returnMoves(int startx, int starty, int bb[][8], int side){
vector<movement> moves;
movement adding;
moves.push_back(adding); moves.push_back(adding); //example
return moves;
}
И я вызываю функцию таким образом из основного:
vector<movement> t1;
t1 = returnMoves(startx, starty, bb, 1);
Он работает, но этот процесс выполняется много раз, и он медленный, поэтому я бы хотел сделать это быстрее, поэтому я рассматривал возможность возврата по ссылке или указателями: вот что я пробовал:
vector<movement> & returnMoves(int startx, int starty, int bb[][8], int side){
vector<movement> temp1;
vector<movement>& moves = temp1;
moves.push_back(adding); moves.push_back(adding);
return moves;
}
и называя его таким же образом:
t1 = returnMoves(startx, starty, bb, 1);
Это дает мне ошибку сегментации, что я делаю неправильно?
Вы возвращаете ссылку на локальную переменную. Переменная temp1
выходит за пределы области после returnMoves
выходы, что приводит к неопределенному поведению. Если вы хотите избежать копирования, вы можете просто передать объект, который хотите заполнить следующим образом:
void generateReturnMoves(vector<movement>& populateThis, int startx, int starty, int bb[][8], int side){
//Add all the movement objects you need to populateThis
}
Теперь вы можете использовать его как:
vector<movement> t1;
generateReturnMoves(t1, startx, starty, bb, 1);
std::vector
уже является просто ссылкой на фактическую память, содержащую объекты, поэтому ваш исходный код просто копирует ссылки (если NRVO не применяется для конструирования вектора непосредственно там, где это требуется вызывающей стороне). В этом преимущество C ++ 11 «перемещение конструктора / перемещение». Если вы видите замедление от исходного, правильного кода, найдите лучший компилятор.