LINUX.ORG.RU

Как хранить объекты возвращённые из функции/метода?

 ,


0

3

Выберите ваш вариант присваивания и расскажите почему используете именно так. Объект после присваивания не меняется. Речь идёт о шареных (implicitly shared) Qt классах, например QString. Итак:

1.

QString str = getString();

2.
const QString str = getString();

3.
const QString &str = getString();

Если implicit sharing потокобезопасный, я бы брал вариант 2. Иначе вариант 3, универсальности и экономии на спичках для.

pon4ik ★★★★★ ()

первые два варианта это копирование с созданием, третье веселее там мы продлеваем жизнь той переменной, которая была создана в getString() - и тут вопрос, а оно точно надо - стоит подумать. Вообщем по ситуации либо 2 либо 3

Silerus ★★★ ()
Ответ на: комментарий от Silerus

первые два варианта это копирование с созданием

Copy elision же.

Ivan_qrt ★★★★★ ()

Какой нахер copy elision? RVO вообще-то. Никакой разницы в сгенерированном коде не будет, ссылка сдесь не имеет смысла и ухудшает понимание кода вызывая wtf, так что нет. const в теории может позволить какие-то оптимизации, на практике компилятор и так поймёт что объект не меняется, так что никакой разницы. Зато const не позволит мувнуть строку если такое понадобится.

Так что первый вариант как самый прозрачный и очевидный.

anonymous ()
Ответ на: комментарий от Silerus

там мы продлеваем жизнь той переменной, которая была создана в getString() - и тут вопрос, а оно точно надо

мы и так её продлеваем в 1 и 2, просто копируя или передвигая её в str.

former_anonymous ★★★ ()
Ответ на: комментарий от former_anonymous

В последнем случае мы не создаем переменную, а просто передаем на нее указатель, в первых двух случаях должно произойти еще очистка памяти. Но вот как это с оптимизирует компилятор, я вот даже не подумал что он будет оптимизировать. Может он действительно как пишет анонимус создаст указатель во всех случаях. Я уже без понятия.

Silerus ★★★ ()
Ответ на: комментарий от anonymous

RVO же не всегда работает. А вариант 3 - идиома языка и имеет смысл отличный от 1 и 2 (продление жизни временного объекта).

Учитывая implicit sharing все варианты примерно равнозначны. У себя в первую очередь рассматриваю 3, потом 1.

four_str_sam ()

1,2.

Третий вариант бесполезен, так как там внутри всё равно указатель.

RazrFalcon ★★★★★ ()

а разве 3 не баг? ты хранишь ссылку на объект, которым не управляешь. иначе бы тебе не потребовалась ссылка.

ckotinko ☆☆☆ ()
Ответ на: комментарий от ckotinko

Константная ссылка продлевает время жизни объекта (при условии, что getString() возвращает объект по значению).

DarkEld3r ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.