Форум программистов, компьютерный форум CyberForum.ru

Оптимизация за счёт устранения временных объектов при использовании операторов - C++

Восстановить пароль Регистрация
 
Accismus
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
28.07.2014, 16:40     Оптимизация за счёт устранения временных объектов при использовании операторов #1
Доброго времени суток!

Вопрос в следующем: существует совет по оптимизации:

"Не создавайте временных объектов" со следующими поястнениями:

"Временные объекты создают, к примеру, вот таким кодом:

C++
1
2
3
    std::string s1, s2, s3;
    ...
    std::string s = s1 + s2 + s3;
В данном случае создается 2 лишних временных объекта: std::string tmp1 = s1 + s2; и std::string tmp2 = tmp1 + s3;. Правильная конкатернация строк выглядит вот так:

C++
1
2
3
4
    std::string s1, s2, s3;
    ...
    std::string s = s1;
    s += s2; s += s3;
"

Помогите новичку сориентироваться, это применимо только для конкатенации строк или для любого типа?
Грубо говоря эффективнее ли
C++
1
2
3
int a(0),b(1),c(2);
a += b;
a += c;
чем
C++
1
2
int a(0),b(1),c(2);
a = b+c;
?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2014, 16:40     Оптимизация за счёт устранения временных объектов при использовании операторов
Посмотрите здесь:

C++ При использовании оператора GOTO зацикливается программа при введении букв.
C++ Ошибки при использовании конструкции if-else.
C++ Перегрузка операторов не для объектов
C++ Добавление и удаление объектов с перегрузкой операторов '+' и '-'
C++ Найти счёт при оптимальной стратегии двух игроков
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
28.07.2014, 16:42     Оптимизация за счёт устранения временных объектов при использовании операторов #2
Цитата Сообщение от Accismus Посмотреть сообщение
или для любого типа?
Для любого.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
28.07.2014, 16:49     Оптимизация за счёт устранения временных объектов при использовании операторов #3
"Premature optimization is the root of all evil." (c) Donald Knuth, 1974.
Accismus
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
28.07.2014, 17:25  [ТС]     Оптимизация за счёт устранения временных объектов при использовании операторов #4
Спасибо!
Ещё одно уточнение: это справедливо только для конкатенации или при применении любого бинарного оператора, который можно использовать цепочкой?

Добавлено через 22 минуты
Цитата Сообщение от CheshireCat Посмотреть сообщение
"Premature optimization is the root of all evil." (c) Donald Knuth, 1974.
"Но в то же время мы не должны забывать о производительности!" Б.Страуструп.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
28.07.2014, 17:31     Оптимизация за счёт устранения временных объектов при использовании операторов #5
Дык, эта.... Правильно работающую программу можно сделать быстрой, и для этого есть даже специальный инструмент - профилировщик. Неправильно работающую программу делать быстрой бессмысленно, не так ли?

Мой личный опыт показывает, что алгоритмическая оптимизация оказывается сильно выигрышнее.
Accismus
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
28.07.2014, 18:19  [ТС]     Оптимизация за счёт устранения временных объектов при использовании операторов #6
Цитата Сообщение от CheshireCat Посмотреть сообщение
Дык, эта.... Правильно работающую программу можно сделать быстрой, и для этого есть даже специальный инструмент - профилировщик. Неправильно работающую программу делать быстрой бессмысленно, не так ли?
Всё верно.

Программа написана. Профилировщик VTune (кстати отдельное спасибо за термин, он был мне неизвестен). Но "узкое место" в нём (после десятков итераций) "unknown stack frame(s)". Гугл вывел на
Кликните здесь для просмотра всего текста
http://dev.wikitt.com/wiki/C++/%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC-%D0%BD%D0%B0-%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5-C++#Ld09dd0b520d181d0bed0b7d0b4d0b0d0b2d0b0d0b9d182d0b520d0b2d180d0b5d0bcd0b5d0bdd0bdd18bd0b520d0bed0b1d18ad0b5d0bad182d18b201
. И в том числе на этот метод. Полагаю он не слишком эффективен? (да и читаемость кода страдает...)

Цитата Сообщение от CheshireCat Посмотреть сообщение
Мой личный опыт показывает, что алгоритмическая оптимизация оказывается сильно выигрышнее.
Спасибо за совет, я не был знаком с таким разделением.
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
28.07.2014, 19:15     Оптимизация за счёт устранения временных объектов при использовании операторов #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вопрос немного риторический: как думаете, компилятор, используя move semantic, сможет res = a + b + c; оптимизировать до
C++
1
2
3
4
decltype(res) t = a;
t += b;
t += c;
res = t;// if C++11 - move, else copy
при правильных объявлениях (operator+ через operator+= и затем инлайн)?
Accismus
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
02.08.2014, 12:51  [ТС]     Оптимизация за счёт устранения временных объектов при использовании операторов #8
Полагаю так оно и будет. Спасибо! и отдельное спасибо за отсылку к move semantic.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
02.08.2014, 13:23     Оптимизация за счёт устранения временных объектов при использовании операторов #9
Accismus, для С++03 и C++98 в отсутствие встроенной move semantic существовала вот эта идиома, нацеленная как раз на такую оптимизацию. Еще про это очень подробно можно почитать в книге "Шаблоны С++. Справочник разработчика, - Д.Вандервуд, Н.М. Джосаттис".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 13:57     Оптимизация за счёт устранения временных объектов при использовании операторов
Еще ссылки по теме:

Ошибка в использовании объектов класса C++
При использовании getline ввод при Enter заканчивается только после пробела C++
C++ Ошибка при использовании %

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CyberSolver
02.08.2014, 13:57     Оптимизация за счёт устранения временных объектов при использовании операторов
  #10

Не по теме:

DrOffset, где-то даже была шутка, что если вам хотят продать компилятор, спросите первым делом, поддерживает ли он RVO. Если вас не поняли - не покупайте у них компилятор.

Yandex
Объявления
02.08.2014, 13:57     Оптимизация за счёт устранения временных объектов при использовании операторов
Ответ Создать тему
Опции темы

Текущее время: 03:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru