1111

by aaqweqweqw on December 23rd, 2009
No notes
Syntax: C++
Show lines - Hide lines - Show in textbox - Download
#include <iostream>
#include <string>
 
struct A
{
   A(std::string s) : s(s)           { std::cout << "A(" << s << ")\n"; }
   A( A const& o ) { s = o.s; std::cout << "copy A, s = " << s << "\n"; }
   std::string s;
};
 
A byValUnnamed()
{
   return A("byval_unnamed");
}
 
A byValNamed()
{
   A a("named");
   return a;
}
 
A& byRef()
{
   static A a("byref");
   return a;
}
 
void byParam(A& a)
{
   A a1("byParam");
   a = a1;
}
 
int main()
{
   // visual studio 2008
   // демонстрация того, что работет return value optimization
   A   a1    = byValUnnamed();  // в дебаге и релизе - одно копирование
 
   A   a2    = byValNamed(); // в дебаге - одно копирование, в релизе - ноль копирований (!!!)
                             // наиболее приятно, но ненадежно (скорость зависит от компилятора)
 
   A   a3val = byRef(); // понятно - никому не надо, RVO и так работает всегда :) 
 
   A & a3ref = byRef(); // очень негибко. Если А - член объекта, а он помрет? битая ссылка будет
                        // если надо так делать с передачей владения, то для этого придуманы смартпойнтеры
                        // если без передачи владения - то для этого придуман boost::weak_ptr
 
   A a5("??? not initialized object"); // вот это плохо
   byParam(a5); // одно копирование, Надежнее всего, но неудобно, да + плохо строчкой выше
 
   system("pause");
}
 
 
 

Leave a Reply

Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS