Двойное копирование в операторах C++

Тема в разделе "LANGS.C", создана пользователем Antolflash, 31 май 2011.

  1. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Пишу одну прогу на C++ в которой жутко много перемножений матриц (точнее говоря, композиций графов, но суть не в этом).
    Всё реализовал в виде отдельных классов: и класс графа и класс матрицы. У всего этого есть бинарный оператор умножения, ну и конечно у классов есть свой конструктор копирования.

    В итоге мне выгодно пользоваться чем-то вроде matr3->multiply(matr1, matr2), что сразу пишет произведение в память выходной матрицы matr3, чем писать (*matr3) = (*matr1) * (*matr2), что после перемножения вызывает конструктор копии, который делает k операций (число элементов матрицы), затем оператор равно, который опять делает k операций, т.е. в итоге перебор на 2k. В контексте больших матриц это очень много.

    Ну вот не додумались создатели языка до такой конструкции, чтобы все эти операторы переводились бы в ту же самую конструкцию matr3->multiply(matr1, matr2). Конечно, нет ничего сложного в том, чтобы продолжать пользоваться matr3->multiply(matr1, matr2), просто это не так лаконично, не так красиво.

    Есть ли такие ООП языки, в которых решены подобные проблемы излишества операций?
     
  2. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    И ещё вопрос. Написание inline перед operator и перед конструктором копирования не изменит число приравниваний (тех, которых 2k)?
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Есть такой язык - С++ 0x. Rvalue reference and move semantics.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Antolflash

    Есть такие библиотеки, в которых решены проблемы излишества велосипедов. http://www.boost.org/doc/libs/release/libs/graph/
     
  5. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    нет не изменит, у inline другой смысл.
    А вы операцию = переопределяете? или она у вас вызывает копирующий конструктор? думаю стоит переопределить =
     
  6. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    h0t
    = определён. Это обычное копирование из аргумента op2 в this.

    _DEN_
    Спасибо за библиотеку, круто, все самые полезные алгритмы тут есть (большую часть из перечисленных я реализововал в учебных целях).
     
  7. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    вот еще что второпях придумал
    можно сделать так:
    Код (Text):
    1. matr a;
    2. matr b;
    3. /*тут что-то делаем с a*/
    4. matr c(a);
    5. c*=b;
    или так
    Код (Text):
    1. matr a;
    2. matr b;
    3. /*тут что-то делаем с a*/
    4. matr c;
    5. (c=a)*=b;
    или даже так
    Код (Text):
    1. matr a;
    2. matr b;
    3. /*тут что-то делаем с a*/
    4. (c=a)*b;
    в итоге, двойного копирования не будет.

    только нужно перегрузить/переопределить оператор *= если 3й вариант то *= переопределять не нужно, только * поменять
    но с перегрузкой без создания временного объекта нужно быть осторожным)
    в таком случае не будет создаваться временный объект
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Antolflash

    Для того чтобы самостоятельно написать оптимальное решение твоей задачи (избавиться от лишних копий при вычислении выражения) тебе нужно прочитать главу "Шаблоны выражений" вот в этой книге: http://www.ozon.ru/context/detail/id/3960662/. Хотя, лучше всего прочитать всю книгу.
     
  9. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    благодарствую за хорошую книгу!
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Причём здесь шаблоны?
     
  11. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Я тоже подумал о перегрузке *=. Я его уже перегрузил именно для цели A = A * B, причём это большая часть перемножений в программе, а простое перемножение C = A * B делаю через процедуру.
     
  12. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    Booster
    если не ошибаюсь, то в той книге хорошо описано, как избавиться от лишних копий.
    P.S. имхо, это книга лучшая, чтобы изучить тонкости языка (поиск имен, перегрузка и т.д.).
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Прочитай указанную главу - поймешь.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Читать не буду, это разновидность ленивых вычислений. В общем согласен, имеет право на существование, просто уже забыл данный термин - шаблоны выражений.