Передает ли передача векторной ссылки право собственности на ее данные?

Как лучше всего передать право собственности на вектор и его данные?

В идеальном мире это работало бы примерно так:

std::vector<int>& SpitAVector(int input)
{
    std::vector<int> result;
    result.push_back(input);
    return result;
}

int main()
{
    std::vector<int> myvec;
    myvec = SpitAVector(60);

    std::cout << (int)myvec[0] << std::endl;  //Outputs 60      
}

Это не работает, поскольку я возвращаю ссылку на локальную переменную.

Можно ли использовать boost::unique_ptr или boost::shared_ptr для обработки этого векторного вывода? (Нельзя использовать unique_ptr в C ++ 11!)


person Daniel    schedule 12.11.2014    source источник
comment
Почему бы вам просто не вернуть его по стоимости? Любой достойный оптимизирующий компилятор оптимизирует копию на ходу.   -  person The Paramagnetic Croissant    schedule 12.11.2014
comment
Любой совместимый компилятор C ++ 11 сделает в лучшем случае только ход. Любой достойный оптимизирующий компилятор полностью исключит копирование / перемещение.   -  person T.C.    schedule 12.11.2014
comment
@TheParamintageCroissant На самом деле, RVO просто построит вектор, в который он будет возвращен, так что никаких современных компиляторов не будет.   -  person cdhowie    schedule 12.11.2014
comment
@cdhowie да, еще одна причина просто вернуть его по значению.   -  person The Paramagnetic Croissant    schedule 12.11.2014
comment
Связанный: stackoverflow.com/q/3134831/332733   -  person Mgetz    schedule 12.11.2014


Ответы (1)


Как лучше всего передать право собственности на вектор и его данные?

Вернуть вектор по значению.

В C ++ 11 или новее возвращаемое значение будет перемещено (при необходимости), поэтому массового копирования данных точно не будет.

Если вы застряли в прошлом, убедитесь, что вы соответствуете критериям copy elision возвращаемого значения. Ваша функция с единственной точкой возврата работает. Хотя это не обязательно, любой достойный компилятор выполнит эту оптимизацию.

Можно ли использовать boost :: unique_ptr или boost :: shared_ptr для обработки этого векторного вывода?

Да, но это было бы излишне сложно. Просто вернитесь по значению.

person Mike Seymour    schedule 12.11.2014
comment
Этот вектор должен содержать около 260 МБ данных. Я предполагаю, что возврат по значению не вызовет копию, тогда - person Daniel; 12.11.2014
comment
@Daniel: Этого не будет, если вы используете C ++ 11 (с семантикой перемещения) или имеете одну точку возврата (как здесь). Я просто пишу некоторые подробности об этом. - person Mike Seymour; 12.11.2014
comment
@Daniel. Большинство компиляторов в наши дни реализуют оптимизацию возвращаемого значения (RVO), в результате чего вектор будет построен в пространстве стека вызывающей функции, куда он будет возвращен - не будет ни конструкции копирования, ни даже ход-конструкция. - person cdhowie; 12.11.2014