Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возвращение объекта, сколько их будет? 
V
    Опции темы
Rickert
Дата 24.9.2009, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Есть класс вектора. И есть второй класс, который совершает операции над векторами. Есть его некая функций:
Код

class aVector
{
  const aVector operator+(const aVector& v)const;
  {
    aVector tmpVector(*this);
    ...
    return (tmpVector);
  }
};
...
aVector aMath::Func(const aVector& vec, const aVector& vec2)
{
  return vec+vec2;
}
...
void main()
{
  aVector v1, v2;
  aVector r;
  
  r = Func(v1, v2);
}

Правильно ли я понимаю что на строке "return vec+vec2" будет создан новый объект типа aVector, который будет результатом сложения; после чего будет создан объект aVector - возвращаемый функцией Func(), и который приравняется вектору, который будет результатом сложения? Т.е. в итоге будет создано два объекта, первый из которых после приравнивания будет уничтожен(является результатом сложения), а второй - тот к которому приравняется r.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
W4FhLF
Дата 24.9.2009, 07:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Напиши свой конструктор копирования и сделай в нём вывод в консоль. Сам увидишь сколько фактически будет создано копий. Теоретически ты прав, будет создано минимум 2 копии. На практике же, в release, компилятор проведёт оптимизацию возвращаемых значений и число копирований здесь уменьшится до одного. Ещё можно сделать методы inline (точнее __inline и в опциях компилятора поставить /Ob1). 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Annihilator
Дата 24.9.2009, 07:17 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



И в r у тебя мусор будет (в Debug версии)

Это сообщение отредактировал(а) Annihilator - 24.9.2009, 07:19


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
zim22
Дата 24.9.2009, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Rickert @  24.9.2009,  06:24 Найти цитируемый пост)
первый из которых после приравнивания будет уничтожен(является результатом сложения), а второй - тот к которому приравняется r.

второй тоже будет уничтожен. после того, как произойдёт присваивание переменной r в функции main.


--------------------
PM MAIL   Вверх
Rickert
Дата 24.9.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Цитата(Annihilator @  24.9.2009,  07:17 Найти цитируемый пост)
И в r у тебя мусор будет (в Debug версии)

Нет там мусора - проверил. С чего вы взяли?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
W4FhLF
Дата 24.9.2009, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Имеется ввиду после объявления объекта наверное. Обычно в debug сборке там мусор. А после присваивания значения уже то, что надо. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Lazin
Дата 24.9.2009, 09:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Rickert @  24.9.2009,  06:24 Найти цитируемый пост)
Правильно ли я понимаю что на строке "return vec+vec2" будет создан новый объект типа aVector, который будет результатом сложения; после чего будет создан объект aVector - возвращаемый функцией Func(), и который приравняется вектору, который будет результатом сложения? Т.е. в итоге будет создано два объекта, первый из которых после приравнивания будет уничтожен(является результатом сложения), а второй - тот к которому приравняется r.

во первых, зачем оператор сложения возвращает const aVector, а не просто aVector?
во вторых, современные компиляторы умеют это оптимизировать, лишняя копия создана не будет, это называется copy elision
PM MAIL Skype GTalk   Вверх
Rickert
Дата 24.9.2009, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Lazin, Вопрос к спецификации вообщем-то, а не к реализации на компиляторах. Но - спасибо.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
SenkraD
Дата 24.9.2009, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



Цитата(Lazin @  24.9.2009,  09:19 Найти цитируемый пост)
во первых, зачем оператор сложения возвращает const aVector, а не просто aVector?

Мейерс "Эффективное использование С++": Праивило 21 (Везде, где толькл можно, используйте const) 


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Lazin
Дата 24.9.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(SenkraD @  24.9.2009,  10:04 Найти цитируемый пост)
Мейерс "Эффективное использование С++": Праивило 21 (Везде, где толькл можно, используйте const)

здесь вполне достаточно того, что метод - константный, константность возвращаемого значения тут абсолютно ничего не дает, а в некоторых случаях может даже мешать
PM MAIL Skype GTalk   Вверх
Rickert
Дата 24.9.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Всем спасибо за ответы. Давайте без оффтопа
solved smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.