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

0

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

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

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 для обработки этого векторного вывода? (Невозможно использовать С++ 11 unique_ptr!)

  • 2
    Почему бы вам просто не вернуть его по значению? Любой достойный оптимизирующий компилятор оптимизирует копию на ходу.
  • 0
    Любой соответствующий компилятор C ++ 11 будет делать только самое большее. Любой достойный оптимизирующий компилятор полностью исключает копирование / перемещение.
Показать ещё 3 комментария
Теги:
rvo

1 ответ

4

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

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

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

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

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

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

  • 0
    Этот вектор должен содержать около 260 МБ данных. Я предполагаю, что возврат по значению не вызовет копию тогда
  • 1
    @Daniel: Не будет, если вы используете C ++ 11 (с семантикой перемещения) или имеете одну точку возврата (как вы делаете здесь). Я просто пишу некоторые подробности об этом.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню