Сегодня я просматриваю код, над которым я работал последние несколько дней, и начал читать семантику перемещения, в частности std:: move. У меня есть несколько вопросов, чтобы спросить вас, за плюсом, чтобы я пошел по правильному пути и не делал глупых предположений!
Во-первых:
1) Первоначально мой код имел функцию, которая возвращала большой вектор:
template<class T> class MyObject
{
public:
std::vector<T> doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(theVector);
}; // eo doSomething
}; // eo class MyObject
Учитывая, что "theVector" является временным в этом и "отбрасыванием", я изменил функцию на:
std::vector<T>&& doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(static_cast<std::vector<T>&&>(theVector));
}; // eo doSomething
Это правильно? Любые подводные камни в этом случае?
2) Я заметил, что в функции, которая у меня есть, возвращается std::string
, которая автоматически называется конструктором перемещения. Отладка в Return of String (спасибо, Aragorn), я заметил, что он называется явным конструктором перемещения. Почему существует один для класса строк, а не для вектора?
Мне не нужно было вносить какие-либо изменения в эту функцию, чтобы воспользоваться семантикой перемещения:
// below, no need for std::string&& return value?
std::string AnyConverter::toString(const boost::any& _val) const
{
string ret;
// convert here
return(ret); // No need for static_cast<std::string&&> ?
}; // eo toString
3) Наконец, я хотел выполнить некоторые тесты производительности, это удивительно быстрые результаты, которые я получил из-за std:: move семантики или мой компилятор (VS2010) тоже сделал некоторую оптимизацию?
(Реализация _getMilliseconds()
опущена для краткости)
std::vector<int> v;
for(int a(0); a < 1000000; ++a)
v.push_back(a);
std::vector<int> x;
for(int a(0); a < 1000000; ++a)
x.push_back(a);
int s1 = _getMilliseconds();
std::vector<int> v2 = v;
int s2 = _getMilliseconds();
std::vector<int> v3 = std::move(x);
int s3 = _getMilliseconds();
int result1 = s2 - s1;
int result2 = s3 - s2;
Результаты были, очевидно, удивительными. result1, стандартное задание, заняло 630 мс. Второй результат - 0мс. Является ли это хорошей проверкой производительности этих вещей?
Я знаю, что некоторые из них очевидны для многих из вас, но я хочу, чтобы убедиться, что я понимаю семантику прямо перед тем, как я запустил блейзер в свой код.
Спасибо заранее!