Этот вопрос был вызван путаницей относительно RVO в C++ 11.Какой метод «возврата» лучше для больших данных в C++/C++ 11?
У меня есть два пути к значению «возврата»: возврата по значению и возврата через ссылочный параметр. Если я не считаю производительность, я предпочитаю первый. Поскольку возврат по значению является более естественным, и я могу легко отличить вход и выход. Но, если я считаю эффективность при возврате больших данных. Я не могу решить, потому что в C++ 11 есть RVO.
Вот мой пример кода, эти два кода выполняют ту же работу:
возврат по значению
struct SolutionType
{
vector<double> X;
vector<double> Y;
SolutionType(int N) : X(N),Y(N) { }
};
SolutionType firstReturnMethod(const double input1,
const double input2);
{
// Some work is here
SolutionType tmp_solution(N);
// since the name is too long, I make alias.
vector<double> &x = tmp_solution.X;
vector<double> &y = tmp_solution.Y;
for (...)
{
// some operation about x and y
// after that these two vectors become very large
}
return tmp_solution;
}
возвращение через ссылочный параметр
void secondReturnMethod(SolutionType& solution,
const double input1,
const double input2);
{
// Some work is here
// since the name is too long, I make alias.
vector<double> &x = solution.X;
vector<double> &y = solution.Y;
for (...)
{
// some operation about x and y
// after that these two vectors become very large
}
}
Вот мои вопросы:
- Как можно обеспечить, что RVO произошло в C++ 11?
- Если мы уверены, что произошло RVO, в настоящее время программирование на С ++, в каком методе «возврат» вы используете , рекомендуем? Зачем?
- Почему существует некоторая библиотека, использующая возврат через ссылочный параметр, стиль кода или историческую причину?
UPDATE Благодаря этим ответам, я знаю, что первый метод лучше в большинстве образом.
Вот некоторые полезные ссылки по теме, которые помогают мне понять эту проблему:
- How to return large data efficiently in C++11
- In C++, is it still bad practice to return a vector from a function?
- Want Speed? Pass by Value.
Будет ли он быть перемещен, даже если в 'возвратных х;' 'x' является Левым и' станд :: move' отсутствует? – Zereges
Не большой поклонник * четвертого *, а? – IInspectable
@Zereges Никогда не возвращайтесь с помощью 'return std :: move (что-то);' Это пессимизация. – NathanOliver