Пишу одну прогу на C++ в которой жутко много перемножений матриц (точнее говоря, композиций графов, но суть не в этом). Всё реализовал в виде отдельных классов: и класс графа и класс матрицы. У всего этого есть бинарный оператор умножения, ну и конечно у классов есть свой конструктор копирования. В итоге мне выгодно пользоваться чем-то вроде matr3->multiply(matr1, matr2), что сразу пишет произведение в память выходной матрицы matr3, чем писать (*matr3) = (*matr1) * (*matr2), что после перемножения вызывает конструктор копии, который делает k операций (число элементов матрицы), затем оператор равно, который опять делает k операций, т.е. в итоге перебор на 2k. В контексте больших матриц это очень много. Ну вот не додумались создатели языка до такой конструкции, чтобы все эти операторы переводились бы в ту же самую конструкцию matr3->multiply(matr1, matr2). Конечно, нет ничего сложного в том, чтобы продолжать пользоваться matr3->multiply(matr1, matr2), просто это не так лаконично, не так красиво. Есть ли такие ООП языки, в которых решены подобные проблемы излишества операций?
И ещё вопрос. Написание inline перед operator и перед конструктором копирования не изменит число приравниваний (тех, которых 2k)?
Antolflash Есть такие библиотеки, в которых решены проблемы излишества велосипедов. http://www.boost.org/doc/libs/release/libs/graph/
нет не изменит, у inline другой смысл. А вы операцию = переопределяете? или она у вас вызывает копирующий конструктор? думаю стоит переопределить =
h0t = определён. Это обычное копирование из аргумента op2 в this. _DEN_ Спасибо за библиотеку, круто, все самые полезные алгритмы тут есть (большую часть из перечисленных я реализововал в учебных целях).
вот еще что второпях придумал можно сделать так: Код (Text): matr a; matr b; /*тут что-то делаем с a*/ matr c(a); c*=b; или так Код (Text): matr a; matr b; /*тут что-то делаем с a*/ matr c; (c=a)*=b; или даже так Код (Text): matr a; matr b; /*тут что-то делаем с a*/ (c=a)*b; в итоге, двойного копирования не будет. только нужно перегрузить/переопределить оператор *= если 3й вариант то *= переопределять не нужно, только * поменять но с перегрузкой без создания временного объекта нужно быть осторожным) в таком случае не будет создаваться временный объект
Antolflash Для того чтобы самостоятельно написать оптимальное решение твоей задачи (избавиться от лишних копий при вычислении выражения) тебе нужно прочитать главу "Шаблоны выражений" вот в этой книге: http://www.ozon.ru/context/detail/id/3960662/. Хотя, лучше всего прочитать всю книгу.
Я тоже подумал о перегрузке *=. Я его уже перегрузил именно для цели A = A * B, причём это большая часть перемножений в программе, а простое перемножение C = A * B делаю через процедуру.
Booster если не ошибаюсь, то в той книге хорошо описано, как избавиться от лишних копий. P.S. имхо, это книга лучшая, чтобы изучить тонкости языка (поиск имен, перегрузка и т.д.).
_DEN_ Читать не буду, это разновидность ленивых вычислений. В общем согласен, имеет право на существование, просто уже забыл данный термин - шаблоны выражений.