От: | Lorenzo_LAMAS | ||
Дата: | 02.10.06 10:24 | ||
Оценка: |
От: | remark | http://www.1024cores.net/ | |
Дата: | 02.10.06 11:06 | ||
Оценка: | +1 |
От: | elcste | ||
Дата: | 02.10.06 14:58 | ||
Оценка: | 8 (1) |
От: | remark | http://www.1024cores.net/ | |
Дата: | 02.10.06 15:17 | ||
Оценка: |
От: | Lorenzo_LAMAS | ||
Дата: | 03.10.06 09:18 | ||
Оценка: |
От: | Lorenzo_LAMAS | ||
Дата: | 03.10.06 09:20 | ||
Оценка: |
От: | Кодт | ||
Дата: | 03.10.06 10:01 | ||
Оценка: | 14 (2) |
#include <iostream>
using std::cout;
using std::endl;
int refcount = 0;
struct share
{
share()
{
++refcount;
cout << this << " : " << __FUNCTION__ << " : " << refcount << endl;
}
share(const share&)
{
++refcount;
cout << this << " : " << __FUNCTION__ << " : " << refcount << endl;
}
~share()
{
--refcount;
cout << this << " : " << __FUNCTION__ << " : " << refcount << endl;
}
int get() const
{
cout << this << " : " << __FUNCTION__ << " : " << refcount << endl;
return 0;
}
};
share make()
{
cout << __FUNCTION__ << " : " << refcount << endl;
return share();
}
int unfold(share tmp)
{
cout << __FUNCTION__ << " : " << refcount << endl;
return tmp.get();
}
void accept(int)
{
cout << __FUNCTION__ << " : " << refcount << endl;
}
int main()
{
cout << __FUNCTION__ << " : " << refcount << endl;
accept(unfold(make()));
cout << __FUNCTION__ << " : " << refcount << endl;
return 0;
}
main : 0
make : 0 -- ещё нет объектов...
0012FE84 : share::share : 1 -- вот мы его создали в make() - return share()
unfold : 1 -- вот он уже как параметр unfold
0012FE84 : share::get : 1 -- пока что жив...
0012FE84 : share::~share : 0 -- вот мы вышли из unfold
accept : 0 -- и к моменту входа в accept все умерли
main : 0
От: | remark | http://www.1024cores.net/ | |
Дата: | 03.10.06 10:02 | ||
Оценка: |
От: | elcste | ||
Дата: | 03.10.06 11:06 | ||
Оценка: | 8 (1) |
при игнорировании 12.8/15The lifetime of a parameter ends when the function in which it is defined returns.
In such cases, the implementation treats the source and target of the omitted copy operation as simply two different ways of referring to the same object, and the destruction of that object occurs at the later of the times when the two objects would have been destroyed without the optimization.
От: | night beast | ||
Дата: | 03.10.06 14:29 | ||
Оценка: |
От: | remark | http://www.1024cores.net/ | |
Дата: | 03.10.06 14:39 | ||
Оценка: |
От: | night beast | ||
Дата: | 03.10.06 14:46 | ||
Оценка: |
От: | night beast | ||
Дата: | 04.10.06 05:56 | ||
Оценка: |
От: | Кодт | ||
Дата: | 04.10.06 08:31 | ||
Оценка: | 32 (5) |
#include <iostream>
using namespace std;
struct Data
{
int m_refcount;
unsigned m_signature;
Data() : m_refcount(0), m_signature(0x900DDA7A) { cout<<"CONSTRUCT"<<endl; }
~Data() { cout<<"DESTROY"<<endl; m_signature=0xDEADFACE; }
void addref() { ++m_refcount; }
void release() { if(--m_refcount==0) delete this; }
};
ostream& operator<<(ostream& ost, const Data& data)
{
return ost<<"Data"<<"(ref="<<data.m_refcount<<",sig="<<hex<<data.m_signature<<dec<<")";
}
struct Ptr;
ostream& operator<<(ostream& ost, const Ptr& );
static int ids = 0;
struct Ptr
{
int m_id; // to see lifetime of particular Ptrs
Data* m_data;
explicit Ptr(Data* data) : m_id(++ids), m_data(data)
{
m_data->addref();
cout<<"ctor "<<*this<<endl;
}
Ptr(const Ptr& src) : m_id(++ids), m_data(src.m_data)
{
m_data->addref();
cout<<"cctor "<<*this<<endl;
}
~Ptr()
{
cout<<"dtor "<<*this<<endl;
m_data->release();
}
Data* get() const
{
cout<<"get "<<*this<<endl;
return m_data;
}
};
ostream& operator<<(ostream& ost, const Ptr& ptr)
{
return ost<<"Ptr #"<<ptr.m_id<<" ("<<*ptr.m_data<<")";
}
void accept(Data* data)
{
cout<<"accept "<<*data<<endl;
}
Data* pass(Ptr ptr)
{
cout<<"pass ("<<ptr<<")"<<endl;
return ptr.get();
}
Ptr rvo_make()
{
cout<<"rvo_make"<<endl;
return Ptr(new Data());
}
Ptr nrvo_make()
{
cout<<"nrvo_make"<<endl;
Ptr ptr(new Data());
cout<<"nrvo_make completed"<<endl;
return ptr;
}
Ptr nonopt_make()
{
cout<<"nonopt_make"<<endl;
if(rand() % 2)
{
Ptr ptr(new Data());
cout<<"nonopt_make completed, v1"<<endl;
return ptr;
}
else
{
Ptr ptr(new Data());
cout<<"nonopt_make completed, v2"<<endl;
return ptr;
}
}
int main()
{
cout<<"---tmp---"<<endl;
ids=0;
accept(pass(Ptr(new Data())));
cout<<"---rvo---"<<endl;
ids=0;
accept(pass(rvo_make()));
cout<<"---nrvo---"<<endl;
ids=0;
accept(pass(nrvo_make()));
cout<<"---nonopt---"<<endl;
ids=0;
accept(pass(nonopt_make()));
}
Действие | debug | release |
---|---|---|
TMP | CONSTRUCT ctor Ptr #1 (Data(ref=1,sig=900dda7a)) pass (Ptr #1 (Data(ref=1,sig=900dda7a))) get Ptr #1 (Data(ref=1,sig=900dda7a)) dtor Ptr #1 (Data(ref=1,sig=900dda7a)) DESTROY accept Data(ref=3473816,sig=3530c0) | CONSTRUCT ctor Ptr #1 (Data(ref=1,sig=900dda7a)) pass (Ptr #1 (Data(ref=1,sig=900dda7a))) get Ptr #1 (Data(ref=1,sig=900dda7a)) dtor Ptr #1 (Data(ref=1,sig=900dda7a)) DESTROY accept Data(ref=3473816,sig=3530c0) |
RVO | rvo_make CONSTRUCT ctor Ptr #1 (Data(ref=1,sig=900dda7a)) pass (Ptr #1 (Data(ref=1,sig=900dda7a))) get Ptr #1 (Data(ref=1,sig=900dda7a)) dtor Ptr #1 (Data(ref=1,sig=900dda7a)) DESTROY accept Data(ref=3473816,sig=355050) | rvo_make CONSTRUCT ctor Ptr #1 (Data(ref=1,sig=900dda7a)) pass (Ptr #1 (Data(ref=1,sig=900dda7a))) get Ptr #1 (Data(ref=1,sig=900dda7a)) dtor Ptr #1 (Data(ref=1,sig=900dda7a)) DESTROY accept Data(ref=3473816,sig=355050) |
NRVO | nrvo_make CONSTRUCT ctor Ptr #1 (Data(ref=1,sig=900dda7a)) nrvo_make completed cctor Ptr #2 (Data(ref=2,sig=900dda7a)) dtor Ptr #1 (Data(ref=2,sig=900dda7a)) pass (Ptr #2 (Data(ref=1,sig=900dda7a))) get Ptr #2 (Data(ref=1,sig=900dda7a)) dtor Ptr #2 (Data(ref=1,sig=900dda7a)) DESTROY accept Data(ref=3473816,sig=355050) | nrvo_make CONSTRUCT ctor Ptr #1 (Data(ref=1,sig=900dda7a)) nrvo_make completed pass (Ptr #1 (Data(ref=1,sig=900dda7a))) get Ptr #1 (Data(ref=1,sig=900dda7a)) dtor Ptr #1 (Data(ref=1,sig=900dda7a)) DESTROY accept Data(ref=3473816,sig=3530c0) |
NonOpt | nonopt_make CONSTRUCT ctor Ptr #1 (Data(ref=1,sig=900dda7a)) nonopt_make completed, v1 cctor Ptr #2 (Data(ref=2,sig=900dda7a)) dtor Ptr #1 (Data(ref=2,sig=900dda7a)) pass (Ptr #2 (Data(ref=1,sig=900dda7a))) get Ptr #2 (Data(ref=1,sig=900dda7a)) dtor Ptr #2 (Data(ref=1,sig=900dda7a)) DESTROY accept Data(ref=3473816,sig=355050) | nonopt_make CONSTRUCT ctor Ptr #1 (Data(ref=1,sig=900dda7a)) nonopt_make completed, v1 cctor Ptr #2 (Data(ref=2,sig=900dda7a)) dtor Ptr #1 (Data(ref=2,sig=900dda7a)) pass (Ptr #2 (Data(ref=1,sig=900dda7a))) get Ptr #2 (Data(ref=1,sig=900dda7a)) dtor Ptr #2 (Data(ref=1,sig=900dda7a)) DESTROY accept Data(ref=3473816,sig=355050) |
От: | Кодт | ||
Дата: | 04.10.06 09:31 | ||
Оценка: | +1 |
От: | remark | http://www.1024cores.net/ | |
Дата: | 04.10.06 09:56 | ||
Оценка: |
От: | Вадим Никулин | Здесь | |
Дата: | 06.10.06 05:17 | ||
Оценка: |
От: | Ovl | ||
Дата: | 06.10.06 09:25 | ||
Оценка: |
От: | Кодт | ||
Дата: | 06.10.06 11:04 | ||
Оценка: | 1 (1) |
Ptr* volatile p;
Ptr nonopt_make()
{
Ptr ptr(new Data());
p = &ptr;
return *p;
}
От: | remark | http://www.1024cores.net/ | |
Дата: | 08.10.06 10:52 | ||
Оценка: | 37 (2) |