![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| aworld |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.9.2007 Репутация: нет Всего: нет |
есть класс описывающий многомерные массивы. Нужно применить к нему агрессивную оптимизацию. Что то вроде встраивания какой то функции в арифметические операторы, чтобы не возникало лишних копировании массивов. Объясните плиз на простом примере как это сделать.
|
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
||||
|
||||
| aworld |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.9.2007 Репутация: нет Всего: нет |
операторы перегружены... как мне объяснял преподователь, нужно написать вспомогательную функцию которая вызывается автоматически при каких то арифметических вычислениях с участием этих массивов и позволяет обойти копирование... нужно ее встраивать в операторы или еще что то я не понял ...
|
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
aworld, ты хоть код покажи, который оптимизировать нужно, будет понятно хоть о чем говорим.
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Шаблоны С++, Джосаттис (глава 18)
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
aworld, если я правильно понял, имеется в виду принцип отложенных вычислений. Пример можно посмотреть у Страуструпа, 3-е издание, п.22.4.7.
|
|||
|
||||
| aworld |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.9.2007 Репутация: нет Всего: нет |
Ln78, вы правильно поняли) прочитав однако эту статью я не разобрался все равно.. не понятно что мне для каждой операции писать такую функцию.. и вообще зачем эти дополнительные структуры.. может ли кто то привести простой пример для конкретного класса для какого-нибудь оператора
Присоединённый файл ( Кол-во скачиваний: 13 )
narray.cpp 22,40 Kb |
|||
|
||||
| Ln78 |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
aworld, сначала общее замечание: давать для примера код с более 800 строками, содержащий синтаксические ошибки, не лучшее дело. Чтобы меньше тратить собственного времени (и так ушло около часа) на переделку, внёс некоторые изменения, в том числе и, вероятно, нежелательные: приватные сделал публичными. Но на примере одной из операций показал, как это можно реализовать (опять же сама операция - заглушка, ИМХО, по-хорошему, нужно писать и свой менеджер памяти, но это уже другой вопрос). Надеюсь, сравнением исходного кода и моего варианта можно отличить, что относится к желаемому примеру, а что - к моей ленности и недостатку времени.
Для операции используется вспомогательная структура
В самом классе для операции сложения векторов добавляются оператор присваивания и конструктор. Суть их действий одинакова, поэтому для избежания дублирования кода лучше использовать вспомогательную функцию
Оператор сложения заменяется такой реализацией
Честно говоря, я бы сделал его членом класса, а не внешним Ну и, собственно, пример использования:
Второй из этих примеров, когда складываются 3 вектора, можно записать, используя вспомогательную функцию структуры naAdd, либо писать новую вспомогательную структуру. Этот вопрос решается индивидуально к каждой операции: для самых частых используются структуры, для других можно обойтись набором функций, из которых их можно получить. Ну вроде всё. Если что-то упустил, или непонятно, спрашивай Присоединённый файл ( Кол-во скачиваний: 4 )
narray.cpp 23,51 Kb |
||||||||
|
|||||||||
| aworld |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.9.2007 Репутация: нет Всего: нет |
Ln78, спасибо выручил. И последний вопрос: можно как то оценить скорость выполнения операции?
|
|||
|
||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
aworld, можно самым простым способом: написать несколько выражений и цикл, измерять время. Есть способы измерения прошедшего времени очень точно, здесь обсуждались, можешь поискать. Для данных целей это не требуется, достаточно обычного GetSystemTime (для windows): вызывается дважды, перед циклом и после. Число итераций задаётся таким, чтобы было достаточно для точности и не слишком долго ждать. Кстати выигрыш от таких вроде не слишком сложных действий со структурами очень ощутим. Их имеет смысл делать даже когда размерность вектора фиксирована (например, является параметром шаблона), а уж с new - тем более.
|
|||
|
||||
| emx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 6.10.2007 Репутация: нет Всего: нет |
Добрый вечер, мы (aworld и я) разобрались более или менее с агрессивной оптимизацией, но при дальнейшем выполнении курсовой (разрабатывая графическое окно для демонстрирования операций) выходят 2 ошибки компиляции при создании обьекта нашего класса. мы никак не можем от них избавиться.
Присоединённый файл ( Кол-во скачиваний: 4 )
NAWinAp.rar 70,06 Kb |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |