Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Accismus
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
1

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

28.07.2014, 16:40. Просмотров 870. Ответов 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;
?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2014, 16:40
Ответы с готовыми решениями:

Оптимизация по размеру при использовании ProGuard
Помогите, пожалуйста, разобраться. Я работаю в Eclipse. В файле project.properties я добавил...

Ошибка Run-time error 13 при использовании блочных операторов Select Case, Elseif
Здравствуйте! Не знаю где ошибка, но все данные у меня числовые. К каждому флажку у меня своя...

Ошибка при использовании слабых ссылок для создания и удаления объектов
Здравствуйте! Изучаю ООП в Perl, дошел до главы 13. Уничтожение объектов книги "Шварц Р., Фой Б.,...

Почему оператор сложения двух временных объектов возвращает lvalue ссылку?
Допустим есть класс: class A { public: A() {} A(const A&) { cout << "A(const A&)\n"; }...

Оптимизация выполнение операторов
Есть такой код реализации матрицы namespace Nero { typedef __nreal nreal; ...

9
Ilot
Эксперт С++
1854 / 1207 / 347
Регистрация: 16.05.2013
Сообщений: 3,189
Записей в блоге: 6
Завершенные тесты: 1
28.07.2014, 16:42 2
Цитата Сообщение от Accismus Посмотреть сообщение
или для любого типа?
Для любого.
0
CheshireCat
Эксперт С++
2916 / 1265 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
28.07.2014, 16:49 3
"Premature optimization is the root of all evil." (c) Donald Knuth, 1974.
4
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.
"Но в то же время мы не должны забывать о производительности!" Б.Страуструп.
0
28.07.2014, 17:25
CheshireCat
Эксперт С++
2916 / 1265 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
28.07.2014, 17:31 5
Дык, эта.... Правильно работающую программу можно сделать быстрой, и для этого есть даже специальный инструмент - профилировщик. Неправильно работающую программу делать быстрой бессмысленно, не так ли?

Мой личный опыт показывает, что алгоритмическая оптимизация оказывается сильно выигрышнее.
6
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 Посмотреть сообщение
Мой личный опыт показывает, что алгоритмическая оптимизация оказывается сильно выигрышнее.
Спасибо за совет, я не был знаком с таким разделением.
0
CyberSolver
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 875
Записей в блоге: 1
28.07.2014, 19:15 7
Лучший ответ Сообщение было отмечено Accismus как решение

Решение

Вопрос немного риторический: как думаете, компилятор, используя 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+= и затем инлайн)?
1
Accismus
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
02.08.2014, 12:51  [ТС] 8
Полагаю так оно и будет. Спасибо! и отдельное спасибо за отсылку к move semantic.
0
DrOffset
11387 / 6139 / 1496
Регистрация: 30.01.2014
Сообщений: 10,004
02.08.2014, 13:23 9
Accismus, для С++03 и C++98 в отсутствие встроенной move semantic существовала вот эта идиома, нацеленная как раз на такую оптимизацию. Еще про это очень подробно можно почитать в книге "Шаблоны С++. Справочник разработчика, - Д.Вандервуд, Н.М. Джосаттис".
0
CyberSolver
02.08.2014, 13:57     Оптимизация за счёт устранения временных объектов при использовании операторов
  #10

Не по теме:

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

0
02.08.2014, 13:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 13:57
Привет! Вот еще темы с ответами:

Следует сравнить отличия в использовании операторов различной конструкции
(For и While или For и Repeat) Результаты измерения роста юношей и девушек одной группы заданны...

Перегрузка операторов не для объектов
Можно ли так делать? Потому что в таком случае вызывается не мой оператор, а исключающее или,...

Добавление и удаление объектов с перегрузкой операторов '+' и '-'
У нас есть массив указателей на объекты, и нужно осуществить добавление и удаление объектов с...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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