Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > возврат объекта по значению


Автор: GoldFinch 28.7.2009, 12:43
компилятор MSVC
есть метод
Foo Bar::foo();  // class Foo {int x,y,z;};

как будет происходить возврат объекта класса Foo по значению? 
т.е. где будет жить объект ( очевидно в стеке ) , кто выделит под него место, и т.п.

Автор: azesmcar 28.7.2009, 12:51
Цитата(GoldFinch @  28.7.2009,  12:43 Найти цитируемый пост)
как будет происходить возврат объекта класса Foo по значению? 

Скорее всего никак, сработает http://en.wikipedia.org/wiki/Return_value_optimization/http://msdn.microsoft.com/en-us/library/ms364057(VS.80).aspx

Цитата(GoldFinch @  28.7.2009,  12:43 Найти цитируемый пост)
т.е. где будет жить объект ( очевидно в стеке ) 

Это temporary object. Сработает копирующий конструктор класса/структуру (для не POD типов) и копия будет возвращена.

Цитата(GoldFinch @  28.7.2009,  12:43 Найти цитируемый пост)
очевидно в стеке  

да.

Цитата(GoldFinch @  28.7.2009,  12:43 Найти цитируемый пост)
кто выделит под него место, и т.п. 

компилятор сделает все необходимое.

Автор: GoldFinch 28.7.2009, 13:15
Цитата(azesmcar @  28.7.2009,  13:51 Найти цитируемый пост)
компилятор сделает все необходимое.

я имел ввиду, вызывающий код, или вызываемая функция

---------
реверсирование показало, что реально компилится
Foo* Bar::foo(Foo*);

но я не очень уверен в этом результате

Автор: azesmcar 28.7.2009, 13:18
Цитата(GoldFinch @  28.7.2009,  13:15 Найти цитируемый пост)
я имел ввиду, вызывающий код, или вызываемая функция

Это уже не относится именно к C++, как он сгенерирует зависит от компилятора.

Цитата(GoldFinch @  28.7.2009,  13:15 Найти цитируемый пост)
Foo* Bar::foo(Foo*);

это тоже зависит от функции, если функция будет встроена то там вообще вызова функции не будет.

Автор: Rififi 28.7.2009, 22:54
как будет происходить возврат объекта класса Foo по значению? 
в новом стандарте временный объект, созданный в функции,  "переедет" в возвращаемый (move semantic)
а пока как обычно, возврат копии через конструктор копирования

Автор: jonie 28.7.2009, 23:59
если не ошибаюсь в win64 эта штука жить в стеке уже не будет, а будет жить в регистрах...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)