![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Я это делал, когда писал с++ обертку для bigdigits.
В принципе, переопределение данного операторов (да и всех математических) имеет смысл только для матемаических классов. |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
не так часто, конечно)) обычно алгебра, bsa прав из последних - классы математических выражений для отображения хода вычислений, года три назад. давно как-то приходилось вектора/матрицы писать Добавлено через 6 минут и 44 секунды еще (довольно давно) были классы для вычислений с учетом размерностей иногда возникают небольшие задачи с использованием operator+ специального вида для строк (вроде конкатенации с добавлением разделителя) Добавлено через 10 минут и 21 секунду пара
по идее должны давать одинаковый код при любой реализации. конечно, это от самих классов и компилятора зависит... давайте проведем эксперимент: предлагайте (разумную) семантику operator+() в конкретном, гипотетически полезном случае - сравним |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Обычно, оператор + реализуется через +=:
|
|||
|
||||
| volatile |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Ну хорошо. Давайте, чтоб не скучно было, выведем первую тыщу чисел фибоначчи. Код конечно далёк от оптимального, (например. в чаре храницца только число в диапазоне [0..9], ну да суть не в этом.
Будем подсчитывать кол-во созданных объектов big_num, потребовавшихся для вычисления. в первом варианте (BALDINA_VARINT) сорри за имя 'BALDINA_VARINT', что-то ничего больше не пришло больше в голову. переименуйте как вам угодно.
На gcc и в студии одинаково. В студии была максимальная оптимизация на скорость + Use Link Time Code Generation Добавлено через 7 минут и 6 секунд Попробовал на codepad.org. Тыщу чисел он не смог переварить, уменьшил в 10 раз http://codepad.org/02MJuOJS http://codepad.org/Ol4LplTE objects: 202 objects: 102 но там без оптимизации. На домашнем компе objects: 102 objects: 52 В любом случае разница в 2 раза количества объектов сохраняецца. |
||||||||
|
|||||||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
да, все верно
пример мог быть и попроще, если деструкторами измерять, доп объект всегда присутствует. кстати, вариант со свободной функцией operator+(), некоторыми компиляторами оптимизируется хуже, чем с членом класса. интересно, что (в данном конкретном случае), компилятор таки умудряется обходиться без фактического "лишнего копирования":
здесь от временного объекта только один след - изменение деструктором object_counter сравните с явно определенным operator=()
Это сообщение отредактировал(а) baldina - 15.5.2013, 14:05 |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
|
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
кол-во деструкторов == равно кол-ву констукторов == кол-ву объектов. деструкторами измерялось только в силу удобства определения в одном месте. Хорошо, хотя это не совсем корректно по сравнению с кол-вом объектов. Тем не менее, операторов присваивания, как и деструкторов в 2 раза больше:
Это сообщение отредактировал(а) volatile - 15.5.2013, 18:52 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Кстати, оператор присваивания рекомендуется делать через операцию swap.
|
|||
|
||||
| volatile |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
bsa, чтоб делать через swap, нужно сначала написать этот swap И кстати, даже если решицца писать его, то для данного конкретного класса, swap априори будет менее эффективен чем memcpy. Так что слепо следовать рекомендациям, далеко не всегда оправдано.
baldina, в общем как я понял, вы хотите сказать, что не смотря на разницу в количестве объектов, операторов присваивания, деструкторов и прочих сишних прибамбасов, компилятор, каким-то неведомым, волшебным способом делает так, что код, всё равно выполняецца за одинаковое время... Ну чтож, давайте (чтоб уже добить тему) измерим и время... Время в миллионах тиков процессора. (по 3 измерения на каждый вариант) Первый вариант
Второй вариант
Весь проект для 2008-ой студии (без бинарников). Это сообщение отредактировал(а) volatile - 15.5.2013, 23:53 Присоединённый файл ( Кол-во скачиваний: 2 )
operators.7z 3,98 Kb |
||||||
|
|||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Да. Не обратил внимания. Обычно, такое через динамические массивы делают.
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
Доберусь до компа, погляжу.
Да, я имел в виду что в частных случаях (частых для математических классов) результат может быть одинаков за счет оптимизации. В общем конечно нет, если требуется вызывать сложные конструкторы/деструкторы Как уже говорил, я сам за каноническую форму, просто хотелось побудить к размышлению и расставить все точки. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |