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

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

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

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

28.07.2014, 16:40. Просмотров 302. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2014, 16:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оптимизация за счёт устранения временных объектов при использовании операторов (C++):

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

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

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

Ошибка в использовании объектов класса - C++
Здравствуйте. У меня есть упрощённый код прог., которая не работает: #include <iostream> class example { private: int *arr;...

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

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

9
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
28.07.2014, 16:42 #2
Цитата Сообщение от Accismus Посмотреть сообщение
или для любого типа?
Для любого.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
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
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
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++#Ld09dd0b520d181d0bed0b7d0b4d0b0d0b2d0b0d0b9d182d0b520d0b2d180d0b5d0bcd0b5d0bdd0bdd18bd0b520d0bed0b1d18ad0b5d0bad182d 18b201
. И в том числе на этот метод. Полагаю он не слишком эффективен? (да и читаемость кода страдает...)

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

Не по теме:

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

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

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

Перегрузка операторов для константных и неконстантных объектов - C++
какая необходимость использовать два таких метода в одном классе? И какой когда отработает? const type * operator(size_t const& row)...

Оптимизация хранения большого количества объектов в Dictionary - C#
Добрый день. Имеется некий класс Quest и список public static Dictionary<Subject, Dictionary<byte, List<Quest>>> newdata_quest = new...

Оптимизация производительности проекта с большим количеством объектов Image - Visual Basic
И снова здравствуйте =) У меня на одной из форм очень много Image. И при нажатии на соответствующую кнопку, что бы перейти к данной форме,...


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

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

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