S>bool func(const type ¶m, std::string &result)
S>{
S> std::string s;
S> // формируем/получаем s <--- Аллоцируется память
S> if (ok)
S> result.swap(s); <--- быстрый swap
S> return ok;
S>}
S>
S>И код 2 S>
S>bool func(const type ¶m, std::string &result)
S>{
S> std::string s;
S> // формируем/получаем s <--- Аллоцируется память
S> if (ok)
S> {
S> result.assign(s); <--- строка копируется;
S> в этот момент в памяти есть две одинаковые строчки: s == result
S> }
S> return ok;
S>}
S>
S>код 3 S>
S>bool func(const type ¶m, std::string &result)
S>{
S> // формируем/получаем используя result <--- Память возможно даже не аллоцируется,
S> а реиспользуется capcity из result
S> return ok;
S>}
S>
S>Есть разница? Когда как лучше поступать?
В порядке убывания эффективности: 3, 1, 2.
Всегда(когда возможно) лучше исполользовать 3.
Без дополнительный ограничений(типа: не менять result при исключении) применений для 1, а тем более для 2 — не вижу.
И ещё: если у result была большая capacity: в первом случае — она "потеряется", во втором и третьем — "останется".
Так что тут ещё нужно учитывать общую стратегию — если необходимо что-то типа shrink_to_fit — то 1.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, sanx, Вы писали:
S>>Код 1: S>>
S>>bool func(const type ¶m, std::string &result)
S>>{
S>> std::string s;
S>> // формируем/получаем s <--- Аллоцируется память
S>> if (ok)
S>> result.swap(s); <--- быстрый swap
S>> return ok;
S>>}
S>>
S>>И код 2 S>>
S>>bool func(const type ¶m, std::string &result)
S>>{
S>> std::string s;
S>> // формируем/получаем s <--- Аллоцируется память
S>> if (ok)
S>> {
S>> result.assign(s); <--- строка копируется;
S>> в этот момент в памяти есть две одинаковые строчки: s == result
S>> }
S>> return ok;
S>>}
S>>
S>>код 3 S>>
S>>bool func(const type ¶m, std::string &result)
S>>{
S>> // формируем/получаем используя result <--- Память возможно даже не аллоцируется,
S>> а реиспользуется capcity из result
S>> return ok;
S>>}
S>>
S>>Есть разница? Когда как лучше поступать?
EP>В порядке убывания эффективности: 3, 1, 2. EP>Всегда(когда возможно) лучше исполользовать 3. EP>Без дополнительный ограничений(типа: не менять result при исключении) применений для 1, а тем более для 2 — не вижу.
да, второй пункт я зря прилепил, понимаю так:
2-ой пункт использовать только если временный буфер из которого мы берем данные для результата — должен быть уничтожен при выходе из функции, например мы получили char* через api ОС и должны его скопировать и освободить.
3-ый пункт самый эффективный, но только если тот кто вызывает, использует result только как ответ, а не посылает в функцию какие-то нужные данные для обработки, которые должны сохраниться в случае неудачи
1-ый пункт — например bool tryFindAndFix(std::string &s); нужно обработать и вернуть измененные данные только в случае успеха, иначе не менять. swap обеспечивает дополнительную гарантию.
EP>Без дополнительный ограничений(типа: не менять result при исключении) применений для 1, а тем более для 2 — не вижу.
Является ли использование swap для библиотечной функции "правилом хорошего тона"? Ну типа не портить в случае ошибки? Или общее правило — делать эффективней, и судить так: если сама логика функции не преобразовывает, а отдает, то используем 3 пункт?
Re[2]: swap внутри функции для параметра-результата
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, sanx, Вы писали:
S>>Есть разница? Когда как лучше поступать?
U>Вот есть у меня банка сладкой кукурузы и банка зеленого горошка бондюэль U>есть между ними разница? когда и что лучше скушать?
Хороший кулинар может часами рассказывать интересные нюансы.
Ну может про часы я немного перегнул.
Re[3]: swap внутри функции для параметра-результата
Здравствуйте, sanx, Вы писали:
S>да, второй пункт я зря прилепил, понимаю так: S>2-ой пункт использовать только если временный буфер из которого мы берем данные для результата —
[...]
Вроде бы всё верно.
EP>>Без дополнительный ограничений(типа: не менять result при исключении) применений для 1, а тем более для 2 — не вижу. S>Является ли использование swap для библиотечной функции "правилом хорошего тона"? Ну типа не портить в случае ошибки? Или общее правило — делать эффективней, и судить так: если сама логика функции не преобразовывает, а отдает, то используем 3 пункт?
Судя по заданному интерфейсу, result — это чисто out параметр. Если это так, то в общем случае — не вижу причин для попыток сохранения его первоначальных значений.
Но всё же, нужно учитывать контекст использования этой функции — возможно она вызывается в цикле, и при ok==false — может понадобится старое значение.
В любом случае желательно задокументировать поведение.
Re[2]: swap внутри функции для параметра-результата
>>bool func(const type ¶m, std::string &result)
>>{
>> // формируем/получаем используя result <--- Память возможно даже не аллоцируется,
>> а реиспользуется capcity из result
>> return ok;
>>}
>>
Подобный вопрос(реиспользование capacity) обсуждался на Going Native 2013
Здравствуйте, sanx, Вы писали:
S>Здравствуйте, uzhas, Вы писали:
U>>Здравствуйте, sanx, Вы писали:
S>>>Есть разница? Когда как лучше поступать?
U>>Вот есть у меня банка сладкой кукурузы и банка зеленого горошка бондюэль U>>есть между ними разница? когда и что лучше скушать?
S>Хороший кулинар может часами рассказывать интересные нюансы.
хороший кулинар поинтерисуется, а что вы ели или собираетесь есть еще. может быть даже позавет сомелье, который поможет определиться с вином под выбранные блюда (утрированно конечно, потому что в жизни наоборот: сначала напитки, потом соответствующая им еда)
S>Ну может про часы я немного перегнул.
Re[4]: swap внутри функции для параметра-результата
Здравствуйте, zaufi, Вы писали:
Z>хороший кулинар поинтерисуется, а что вы ели или собираетесь есть еще. может быть даже позавет сомелье, который поможет определиться с вином под выбранные блюда (утрированно конечно, потому что в жизни наоборот: сначала напитки, потом соответствующая им еда)
Ну как сказать — это зависит от акцентов. Если основная тема мероприятия — именно изысканое блюдо, то вино, как ни крути, будут подбирать под еду. Ну и наоборот.
Re[4]: swap внутри функции для параметра-результата
Здравствуйте, zaufi, Вы писали:
S>>Хороший кулинар может часами рассказывать интересные нюансы. Z>хороший кулинар поинтерисуется, а что вы ели или собираетесь есть еще. может быть даже позавет сомелье, который поможет определиться с вином под выбранные блюда (утрированно конечно, потому что в жизни наоборот: сначала напитки, потом соответствующая им еда)
Это хороший метрдотель. А в это время, на кухне кулинар продолжает ездить по ушам официантке...