Сегодня я взглянул на код, над которым работал последние несколько дней, и начал изучать семантику перемещения, в частности, 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 (спасибо, Арагорн), я заметил, что он называется явным конструктором перемещения. Почему есть класс строки, а не вектор?
Мне не пришлось вносить какие-либо изменения в эту функцию, чтобы воспользоваться семантикой перемещения:
// 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;
Результаты были, очевидно, потрясающими. Результат1, стандартное задание, занял 630мс. Второй результат был 0мс. Это хороший тест производительности этих вещей?
Я знаю, что кое-что из этого очевидно для многих из вас, но я хочу убедиться, что понимаю семантику прямо перед тем, как приступить к блейзеру в своем коде.
Заранее спасибо!