Правильно ли это использование семантики "перемещения" C ++?

Сегодня вечером я взглянул на код, над которым работал последние несколько дней, и начал изучать семантику перемещения, в частности std: :шаг. У меня есть несколько вопросов, которые я хочу задать вам, профи, чтобы убедиться, что я иду правильным путем и не делаю глупых предположений!

Во-первых:

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 , что он автоматически вызвал конструктор перемещения. Отлаживая возврат строки (спасибо, Арагорн), я заметил, что он вызывает явный конструктор перемещения. Почему существует один для строкового класса, а не для вектора?

Мне не пришлось вносить какие-либо изменения в эту функцию, чтобы воспользоваться семантикой перемещения:

// 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 мс. Это хороший тест на производительность этих вещей?

Я знаю, что некоторые из вас очевидны, но я хочу убедиться, что понимаю семантику прямо перед тем, как приступить к написанию кода.

Заранее спасибо!

33
задан bitek 15 March 2013 в 13:30
поделиться