Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2010, 00:24   #1
Kn793
Форумчанин
 
Регистрация: 20.06.2008
Сообщений: 125
По умолчанию Оптимизируем return объекта; конструктор копирования

Есть класс
Код:
class A {
public:
	int arr[10000];
};
Например нужно написать функцию
Код:
A sum(const A & arg1, const A & arg2);
Которая будет возвращать объект с просуммированным массивом(result.arr[i] = arg1.arr[i] + arg2.arr[i]; )

Можно конечно написать что-нибудь вроде
Код:
A sum(const A & arg1, const A & arg2) {
    A res;
    for (int i = 0; i << 10000; ++i)
        res.arr[i] = arg1.arr[i] + arg2.arr[i];
    return res;
}
Но тут происходит создание временного объекта, а потом его копирование, что довольно печально.

Можно ли как нибудь этого избежать?
A sum(A & result, const A & arg1, const A & arg2); не предлагать вопрос скорее теоретический
Kn793 вне форума Ответить с цитированием
Старый 24.04.2010, 01:23   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну, в некоторых случаях компилятор в качестве оптимизации может не проводить копирование объекта, а оставить его в стеке, не теряя таким образом время на копирование, но на сие полагаться не стоит )
Наиболее логичным было бы реализовать копирование по записи, то бишь разделение единственного массива между множеством объектов, при этом копия будет производится только когда какой-то из объектов попытается записать что-нибудь в этот массив, избегая глубокого копирования при передаче объектов в качестве параметра/возвращения из объекта из ф-ции. Пример этого, если не ошибаюсь, был у Страуструпа в его реализации класса строки - можете поискать.
netrino вне форума Ответить с цитированием
Старый 24.04.2010, 20:26   #3
Nick Alte
 
Регистрация: 24.04.2010
Сообщений: 4
По умолчанию

Другим интересным способом является реализация оператора += и оператора + на его основе:
Код:
A& A::operator += (const A& op2)
{
    for (int i = 0; i << 10000; ++i)
        arr[i] += op2.arr[i];
    return *this;
}

A A::operator + (const A& op2) const
{
    A retval(*this);
    return retval += op2;
}
Тогда за счёт некоторого увеличения корявости формул можно сэкономить на временных объектах, используя += вместо +.
Nick Alte вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
классы,конструктор копирования,динамический массив экземпляров.Нужна помощь bylynka Общие вопросы C/C++ 1 30.04.2009 21:56
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37
Как поменять одну из текстур объекта не меняя все остальные и без повторной загрузки объекта в GLScene DomKr@t Мультимедиа в Delphi 0 14.12.2008 01:52
Конструктор копирования Djaconda Общие вопросы C/C++ 3 11.06.2008 18:54