Russian Qt Forum
Ноябрь 23, 2024, 22:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Возврат объекта  (Прочитано 2877 раз)
blood_shadow
Гость
« : Май 16, 2011, 12:39 »

Даж стыдно за такой вопрос, но надо восполнить пробелы в знаниях..
Допустим есть объект:
Код
class Message
{
public:
   Message() {};
   Message(const MessageHeader &header, const MessageBody &body);
private:
   MessageHeader header;
   MessageBody body;
 
}
 
где MessageHeader и MessageBody - структуры, конструктор Message(const MessageHeader &header, const MessageBody &body) -
делает просто инициализацию header и body

Допустим есть метод:
Код
C++ (Qt)
Message Someclass::someMethod()
{
   MessageHeader header;
   MessageBody body;
   // assignment and other operation on header and  body
   Message message(header, body);
 
   return message;
}
 

я так понимаю в этом случае будет создан временный объект с помощью конструктора копирования
для объекта message, и ретурн возвратит именно этот временный объект

а если сделать так:

Код
C++ (Qt)
Message Someclass::someMethod()
{
   MessageHeader header;
   MessageBody body;
   // assignment and other operation on header and  body
 
   return Message(header, body);
}
 

то возвратиться сразу временный объект без конструктора копирования? то есть такой способ более экономичен?

Спасибо
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Май 16, 2011, 12:51 »

Это тесно связано с де-факто оптимизацией и зависит от того как ф-ция вызывается

Код
C++ (Qt)
// так оптимизация сработает, будет вызван 1 конструктор Message (ну может не в MSVC debug)
Message msg = someObj.GetMessage();  
 
// а так вызывается конструктор + оператор присваивания, и оптимизация отдыхает
Message msg;
...
msg = someObj.GetMessage();  
 

Даж стыдно за такой вопрос, но надо восполнить пробелы в знаниях..
Стыдиться совершенно нечего
Записан
blood_shadow
Гость
« Ответ #2 : Май 16, 2011, 13:09 »

Это тесно связано с де-факто оптимизацией и зависит от того как ф-ция вызывается

насчет присваивания эт понятно, а насчет вызова ф-ции someMethod() в первом варианте
ф-ции будет вызван:
конструктор + конструктор копирования, а во втором только конструктор(для возврата имеется ввиду)?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Май 16, 2011, 13:22 »

насчет присваивания эт понятно, а насчет вызова ф-ции someMethod() в первом варианте
ф-ции будет вызван:
конструктор + конструктор копирования, а во втором только конструктор(для возврата имеется ввиду)?
В первом варианте будет вызван только один конструктор и все (независимо от того куда Вы его воткнули внутри метода) - в этом смысл оптимизации
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Май 16, 2011, 13:23 »

По стандарту вроде как в любом случае дожен вызываться конструктор копирования, но во втором примере все компиляторы действительно оптимизируют объект, созданный в ретурне.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.108 секунд. Запросов: 23.