Russian Qt Forum

Программирование => С/C++ => Тема начата: blood_shadow от Май 16, 2011, 12:39



Название: Возврат объекта
Отправлено: 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);
}
 

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

Спасибо


Название: Re: Возврат объекта
Отправлено: Igors от Май 16, 2011, 12:51
Это тесно связано с де-факто оптимизацией и зависит от того как ф-ция вызывается

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

Даж стыдно за такой вопрос, но надо восполнить пробелы в знаниях..
Стыдиться совершенно нечего


Название: Re: Возврат объекта
Отправлено: blood_shadow от Май 16, 2011, 13:09
Это тесно связано с де-факто оптимизацией и зависит от того как ф-ция вызывается

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


Название: Re: Возврат объекта
Отправлено: Igors от Май 16, 2011, 13:22
насчет присваивания эт понятно, а насчет вызова ф-ции someMethod() в первом варианте
ф-ции будет вызван:
конструктор + конструктор копирования, а во втором только конструктор(для возврата имеется ввиду)?
В первом варианте будет вызван только один конструктор и все (независимо от того куда Вы его воткнули внутри метода) - в этом смысл оптимизации


Название: Re: Возврат объекта
Отправлено: Авварон от Май 16, 2011, 13:23
По стандарту вроде как в любом случае дожен вызываться конструктор копирования, но во втором примере все компиляторы действительно оптимизируют объект, созданный в ретурне.