Russian Qt Forum
Ноябрь 24, 2024, 07:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Перегрузка операторов: управление ресурсами (памятью)  (Прочитано 10769 раз)
twp
Гость
« Ответ #15 : Май 13, 2013, 18:45 »

То есть я могу таким способом избежать утечек памяти, работая с указателями, но не с объектами в контексте операторов.
Я Вас понял, стоит почитать про move assignment operator и move constructor, а также о "шаблонах выражений", спасибо Улыбающийся
Еще наверно стоит почитать про Implicit Sharing.
При этом подходе не используются ни шаблоны, ни возможности C++11, но при этом копирование происходит потоко-безопасно и без больших накладных расходах. На этом подходе базируются многие классы Qt начиная с QString и заканчивая классов контейнеров. А скажем QDomNode использует explicit sharing т.е. поведение указателей в отличие от implicit sharing.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Май 14, 2013, 10:05 »

Еще наверно стоит почитать про Implicit Sharing.
При этом подходе не используются ни шаблоны, ни возможности C++11, но при этом копирование происходит потоко-безопасно и без больших накладных расходах. На этом подходе базируются многие классы Qt начиная с QString и заканчивая классов контейнеров. А скажем QDomNode использует explicit sharing т.е. поведение указателей в отличие от implicit sharing.
Так-то оно так, но код предполагающий имплисит шару легко может оказаться непортабельным за пределы Qt. Поэтому мне кажется привыкать к этой "маминой сисе" не стоит.

Возвращаясь к теме: если Вы определили оператор +, то возврат по значению нужен, избегать его не стоит - такой монструозный оператор уже будет нечто другое. Хотите без временных - используйте +=.

"Перегруженные операторы должны иметь точно такой же смысл как в С" - так пишут в книжках и я с ними (в данном случае) полностью согласен. Вообще Ваш пример неестественный - что такое + для матрицы? Чему это соответствует в матричных операциях? Слишком много надумано 
Записан
twp
Гость
« Ответ #17 : Май 14, 2013, 10:40 »

Так-то оно так, но код предполагающий имплисит шару легко может оказаться непортабельным за пределы Qt. Поэтому мне кажется привыкать к этой "маминой сисе" не стоит.
Тема была создана в разделе Qt, а не pure C++, так что никаких противоречий не вижу. И вообще с таким подходом можно все Qt обозвать "маминой сисей". А что ж тогда использовать, stl или взрывающие мозг boost или loki, а может нравится изобретать велосипеды? Ничего не имею против - каждый выбирает что ему ближе.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #18 : Май 14, 2013, 10:48 »


"Перегруженные операторы должны иметь точно такой же смысл как в С" - так пишут в книжках и я с ними (в данном случае) полностью согласен. Вообще Ваш пример неестественный - что такое + для матрицы? Чему это соответствует в матричных операциях? Слишком много надумано 

Значит оператор + для Color - это вполне в порядке вещей, а для матриц оператор + (которым все математики пользуются уже давным давно) - это уже нонсенс, да?)

Кстати, Implicit Sharing, это, конечно, хорошо, но от временных объектов он опять-таки не поможет..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Май 14, 2013, 12:07 »

Тема была создана в разделе Qt, а не pure C++, так что никаких противоречий не вижу. И вообще с таким подходом можно все Qt обозвать "маминой сисей".
И это очень верно - развивается эффект привыкания, типа "великий спец, но... только при наличии готовых Qt классов - а без них и пукнуть не может".

А что ж тогда использовать, stl или взрывающие мозг boost или loki, а может нравится изобретать велосипеды? Ничего не имею против - каждый выбирает что ему ближе.
Тоже согласен, выбирать так или иначе придется, только "ближе к языку и меньше зависимостей" = лучше. Кстати обойти STL вряд ли удастся

Значит оператор + для Color - это вполне в порядке вещей, а для матриц оператор + (которым все математики пользуются уже давным давно) - это уже нонсенс, да?)
Операция + для Color совершенно интуитивна, ведь Вы смешивали краски в детстве  Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #20 : Май 14, 2013, 12:29 »

И ещё,по-поводу implicit sharing.. В готовых решениях, товарищ navrocky, это уже реализовал без использования Qt.. http://www.prog.org.ru/topic_15029_0.html

А для тех, у кого бустофобия, сейчас уже можно заменить boost::shared_ptr и boost::make_shared на их аналоги из stl
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
keekdown
Гость
« Ответ #21 : Май 19, 2013, 14:07 »

Это не очень эффективный код.
Во-первых у вас при операциях над матрицами создаются временные объекты.. Для больших матриц и длинных выражениях, например:
m1  + m2 + m3 - m4 +..
это будет очень медленно работать и отъедать много памяти..
Я как то уже писал о том, как эту проблему можно решить с помощью "шаблонов выражений". http://www.prog.org.ru/topic_21540_0.html
Но лучше ещё подсмотреть, как это всё реализовано в boost'е.   

Во-вторых, всё же лучше бинарные операторы (такие как +, -) делать не членами класса, т.е.
Код
C++ (Qt)
class Matrix
{
...
friend const Matrix & operator+(const Matrix &, const Matrix &);
};
 
const Matrix & operator+(const Matrix & m1, const Matrix & m2);
 
 
Но это лишь, как рекомендуемая форма.. 

И ещё, здесь уместно вспомнить о новых возможностях c++11, а именно о перемещающем конструкторе (move constructor) и перемещающем операторе присваивания (move assignment operator).
Для таких объектов, как матрицы, они могут быть очень полезны.
Полностью согласен с вами)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.146 секунд. Запросов: 23.