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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Accismus
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
#1

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

28.07.2014, 16:40. Просмотров 287. Ответов 9
Метки нет (Все метки)

Доброго времени суток!

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

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

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

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++
Ошибка при перегрузке операторов. C++
Перегрузка операторов при наследовании C++
C++ Перегрузка операторов не для объектов
Ошибка при переопределении операторов C++
C++ Добавление и удаление объектов с перегрузкой операторов '+' и '-'
Ошибки при перегрузке операторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
28.07.2014, 16:42     Оптимизация за счёт устранения временных объектов при использовании операторов #2
Цитата Сообщение от Accismus Посмотреть сообщение
или для любого типа?
Для любого.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
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
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
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
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
6859 / 4070 / 927
Регистрация: 30.01.2014
Сообщений: 6,867
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++ Найти счёт при оптимальной стратегии двух игроков
Ошибка в использовании объектов класса C++
Реализация операторов при полиморфизме C++
Почему оператор сложения двух временных объектов возвращает lvalue ссылку? C++
Перегрузка операторов для константных и неконстантных объектов C++

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

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

Не по теме:

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru