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

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

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

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

28.07.2014, 16:40. Просмотров 294. Ответов 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     Оптимизация за счёт устранения временных объектов при использовании операторов
Посмотрите здесь:

Почему оператор сложения двух временных объектов возвращает 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;...

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

Найти счёт при оптимальной стратегии двух игроков - C++
взялся тут решать задачку с олимпиады, и честно говоря уже час потратил за зря...Никак не могу продумать сам алгоритм игры игроков... ...

Баг при использовании класса string при записи в бинарный файл - C++
При записи в бинарный файл пользовательского класса, всё отлично отрабатывает, но, если в классе использовался класс string, то в конце...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
28.07.2014, 16:42     Оптимизация за счёт устранения временных объектов при использовании операторов #2
Цитата Сообщение от Accismus Посмотреть сообщение
или для любого типа?
Для любого.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,364
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
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,364
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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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     Оптимизация за счёт устранения временных объектов при использовании операторов
Еще ссылки по теме:

При использовании оператора GOTO зацикливается программа при введении букв. - C++
Приветствую всех новых знакомых в этом храме программирования. Я новичек, пытаюсь программировать в С++ недавно. У меня возник вопрос...

При использовании getline ввод при Enter заканчивается только после пробела - C++
int main() { string slovo; double n; while(slovo != "пока" ) { getline (cin,slovo,' '); if (slovo ==...

Ошибка при перегрузке операторов. - C++
Здравствуйте! Возникла необходимость создать свой класс-обертку для работы с большими числами. Бибилиотека mpir=порт GMP. Пример рабочий:...

Перегрузка операторов при наследовании - C++
Есть базовый(StringType) и производный(tcomplex) классы. Соотвественно это строка и комплексное число. По заданию необходимо было создать...

Ошибка при переопределении операторов - C++
Есть класс квадратной матрицы: class Matrix { private: int n; int **elements; public: Matrix(int _n); ~Matrix();


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

Или воспользуйтесь поиском по форуму:
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