Προς το περιεχόμενο

rval ref c++ 0x


Evgenios1

Προτεινόμενες αναρτήσεις

Δημοσ.

Πω πω! Τι ωραιο που ειναι αυτο το καινουριο πραμα :rolleyes:. Με το που διαβασα πως δουλευει μπηκα στο πειρασμο να το δοκιμασω. Απλα δειτε τα αποτελεσματα του γεμισματος ενους vector.

Χωρις move constructor

>Process time:2933ms
Max memory needed:655888384
Total memory that need:335544300

 

Create object Total Memory:16834560 bytes

Copy object Total Memory:33751040 bytes

Delete object Total Memory:16949248 bytes

Create object Total Memory:33759232 bytes

Copy object Total Memory:50573312 bytes

Delete object Total Memory:33767424 bytes

Copy object Total Memory:50577408 bytes

Delete object Total Memory:33767424 bytes

Create object Total Memory:50577408 bytes

Copy object Total Memory:67391488 bytes

Copy object Total Memory:84205568 bytes

Delete object Total Memory:67395584 bytes

Delete object Total Memory:50581504 bytes

Copy object Total Memory:67395584 bytes

Delete object Total Memory:50585600 bytes

Create object Total Memory:67395584 bytes

Copy object Total Memory:84205568 bytes

Copy object Total Memory:101019648 bytes

Copy object Total Memory:117833728 bytes

Delete object Total Memory:101023744 bytes

Delete object Total Memory:84209664 bytes

Delete object Total Memory:67399680 bytes

Copy object Total Memory:84209664 bytes

Delete object Total Memory:67399680 bytes

Create object Total Memory:84209664 bytes

Copy object Total Memory:101023744 bytes

Copy object Total Memory:117833728 bytes

Copy object Total Memory:134647808 bytes

Copy object Total Memory:151461888 bytes

Delete object Total Memory:134651904 bytes

Delete object Total Memory:117841920 bytes

Delete object Total Memory:101027840 bytes

Delete object Total Memory:84213760 bytes

Copy object Total Memory:101027840 bytes

Delete object Total Memory:84217856 bytes

Create object Total Memory:101027840 bytes

Copy object Total Memory:117837824 bytes

Delete object Total Memory:101027840 bytes

Create object Total Memory:117837824 bytes

Copy object Total Memory:134651904 bytes

Copy object Total Memory:151461888 bytes

Copy object Total Memory:168275968 bytes

Copy object Total Memory:185090048 bytes

Copy object Total Memory:201904128 bytes

Copy object Total Memory:218718208 bytes

Delete object Total Memory:201908224 bytes

Delete object Total Memory:185094144 bytes

Delete object Total Memory:168284160 bytes

Delete object Total Memory:151470080 bytes

Delete object Total Memory:134660096 bytes

Delete object Total Memory:117841920 bytes

Copy object Total Memory:134656000 bytes

Delete object Total Memory:117846016 bytes

Create object Total Memory:134656000 bytes

Copy object Total Memory:151470080 bytes

Delete object Total Memory:134660096 bytes

Create object Total Memory:151470080 bytes

Copy object Total Memory:168284160 bytes

Delete object Total Memory:151474176 bytes

Create object Total Memory:168284160 bytes

Copy object Total Memory:185094144 bytes

Copy object Total Memory:201908224 bytes

Copy object Total Memory:218718208 bytes

Copy object Total Memory:235532288 bytes

Copy object Total Memory:252346368 bytes

Copy object Total Memory:269160448 bytes

Copy object Total Memory:285974528 bytes

Copy object Total Memory:302788608 bytes

Copy object Total Memory:319602688 bytes

Delete object Total Memory:302792704 bytes

Delete object Total Memory:285978624 bytes

Delete object Total Memory:269168640 bytes

Delete object Total Memory:252354560 bytes

Delete object Total Memory:235540480 bytes

Delete object Total Memory:218726400 bytes

Delete object Total Memory:201916416 bytes

Delete object Total Memory:185102336 bytes

Delete object Total Memory:168288256 bytes

Copy object Total Memory:185102336 bytes

Delete object Total Memory:168292352 bytes

Create object Total Memory:185102336 bytes

Copy object Total Memory:201916416 bytes

Delete object Total Memory:185106432 bytes

Create object Total Memory:201916416 bytes

Copy object Total Memory:218726400 bytes

Delete object Total Memory:201916416 bytes

Create object Total Memory:218726400 bytes

Copy object Total Memory:235540480 bytes

Delete object Total Memory:218730496 bytes

Create object Total Memory:235540480 bytes

Copy object Total Memory:252350464 bytes

Copy object Total Memory:269164544 bytes

Copy object Total Memory:285978624 bytes

Copy object Total Memory:302792704 bytes

Copy object Total Memory:319602688 bytes

Copy object Total Memory:336416768 bytes

Copy object Total Memory:353230848 bytes

Copy object Total Memory:370044928 bytes

Copy object Total Memory:386859008 bytes

Copy object Total Memory:403673088 bytes

Copy object Total Memory:420487168 bytes

Copy object Total Memory:437305344 bytes

Copy object Total Memory:454119424 bytes

Delete object Total Memory:437309440 bytes

Delete object Total Memory:420499456 bytes

Delete object Total Memory:403685376 bytes

Delete object Total Memory:386875392 bytes

Delete object Total Memory:370061312 bytes

Delete object Total Memory:353247232 bytes

Delete object Total Memory:336433152 bytes

Delete object Total Memory:319619072 bytes

Delete object Total Memory:302804992 bytes

Delete object Total Memory:285995008 bytes

Delete object Total Memory:269180928 bytes

Delete object Total Memory:252362752 bytes

Delete object Total Memory:235548672 bytes

Copy object Total Memory:252362752 bytes

Delete object Total Memory:235552768 bytes

Create object Total Memory:252362752 bytes

Copy object Total Memory:269176832 bytes

Delete object Total Memory:252366848 bytes

Create object Total Memory:269176832 bytes

Copy object Total Memory:285990912 bytes

Delete object Total Memory:269180928 bytes

Create object Total Memory:285990912 bytes

Copy object Total Memory:302804992 bytes

Delete object Total Memory:285995008 bytes

Create object Total Memory:302804992 bytes

Copy object Total Memory:319614976 bytes

Delete object Total Memory:302804992 bytes

Create object Total Memory:319614976 bytes

Copy object Total Memory:336429056 bytes

Delete object Total Memory:319619072 bytes

Create object Total Memory:336429056 bytes

Copy object Total Memory:353239040 bytes

Copy object Total Memory:370053120 bytes

Copy object Total Memory:386867200 bytes

Copy object Total Memory:403681280 bytes

Copy object Total Memory:420495360 bytes

Copy object Total Memory:437309440 bytes

Copy object Total Memory:454119424 bytes

Copy object Total Memory:470933504 bytes

Copy object Total Memory:487747584 bytes

Copy object Total Memory:504561664 bytes

Copy object Total Memory:521375744 bytes

Copy object Total Memory:538189824 bytes

Copy object Total Memory:555003904 bytes

Copy object Total Memory:571817984 bytes

Copy object Total Memory:588632064 bytes

Copy object Total Memory:605446144 bytes

Copy object Total Memory:622260224 bytes

Copy object Total Memory:639074304 bytes

Copy object Total Memory:655888384 bytes

Delete object Total Memory:639078400 bytes

Delete object Total Memory:622268416 bytes

Delete object Total Memory:605454336 bytes

Delete object Total Memory:588640256 bytes

Delete object Total Memory:571826176 bytes

Delete object Total Memory:555016192 bytes

Delete object Total Memory:538202112 bytes

Delete object Total Memory:521388032 bytes

Delete object Total Memory:504573952 bytes

Delete object Total Memory:487759872 bytes

Delete object Total Memory:470941696 bytes

Delete object Total Memory:454127616 bytes

Delete object Total Memory:437313536 bytes

Delete object Total Memory:420503552 bytes

Delete object Total Memory:403689472 bytes

Delete object Total Memory:386875392 bytes

Delete object Total Memory:370061312 bytes

Delete object Total Memory:353243136 bytes

Delete object Total Memory:336429056 bytes

Copy object Total Memory:353243136 bytes

Delete object Total Memory:336433152 bytes

Delete object Total Memory:319614976 bytes

Delete object Total Memory:302800896 bytes

Delete object Total Memory:285986816 bytes

Delete object Total Memory:269172736 bytes

Delete object Total Memory:252358656 bytes

Delete object Total Memory:235544576 bytes

Delete object Total Memory:218726400 bytes

Delete object Total Memory:201912320 bytes

Delete object Total Memory:185098240 bytes

Delete object Total Memory:168284160 bytes

Delete object Total Memory:151470080 bytes

Delete object Total Memory:134656000 bytes

Delete object Total Memory:117841920 bytes

Delete object Total Memory:101027840 bytes

Delete object Total Memory:84213760 bytes

Delete object Total Memory:67399680 bytes

Delete object Total Memory:50585600 bytes

Delete object Total Memory:33771520 bytes

Delete object Total Memory:16953344 bytes

Delete object Total Memory:135168 bytes

Process time:2933ms

Max memory needed:655888384

Total memory that need:335544300

 

 

 

Και με move constructor

>Process time:1154ms
Max memory needed:336412672
Total memory that need:335544300

 

Create object Total Memory:16834560 bytes

Object moved Total Memory:16936960 bytes

Object moved Total Memory:16936960 bytes

Delete object Total Memory:16936960 bytes

Create object Total Memory:33751040 bytes

Object moved Total Memory:33751040 bytes

Object moved Total Memory:33755136 bytes

Delete object Total Memory:33755136 bytes

Object moved Total Memory:33755136 bytes

Object moved Total Memory:33755136 bytes

Delete object Total Memory:33755136 bytes

Create object Total Memory:50569216 bytes

Object moved Total Memory:50569216 bytes

Object moved Total Memory:50569216 bytes

Object moved Total Memory:50569216 bytes

Object moved Total Memory:50569216 bytes

Delete object Total Memory:50569216 bytes

Delete object Total Memory:50569216 bytes

Object moved Total Memory:50569216 bytes

Object moved Total Memory:50569216 bytes

Delete object Total Memory:50569216 bytes

Create object Total Memory:67383296 bytes

Object moved Total Memory:67383296 bytes

Object moved Total Memory:67383296 bytes

Object moved Total Memory:67383296 bytes

Object moved Total Memory:67383296 bytes

Object moved Total Memory:67383296 bytes

Object moved Total Memory:67383296 bytes

Delete object Total Memory:67383296 bytes

Delete object Total Memory:67383296 bytes

Delete object Total Memory:67383296 bytes

Object moved Total Memory:67383296 bytes

Object moved Total Memory:67383296 bytes

Delete object Total Memory:67383296 bytes

Create object Total Memory:84197376 bytes

Object moved Total Memory:84197376 bytes

Object moved Total Memory:84197376 bytes

Object moved Total Memory:84197376 bytes

Object moved Total Memory:84197376 bytes

Object moved Total Memory:84197376 bytes

Object moved Total Memory:84197376 bytes

Object moved Total Memory:84197376 bytes

Object moved Total Memory:84197376 bytes

Delete object Total Memory:84197376 bytes

Delete object Total Memory:84197376 bytes

Delete object Total Memory:84197376 bytes

Delete object Total Memory:84197376 bytes

Object moved Total Memory:84197376 bytes

Object moved Total Memory:84197376 bytes

Delete object Total Memory:84197376 bytes

Create object Total Memory:101011456 bytes

Object moved Total Memory:101011456 bytes

Object moved Total Memory:101011456 bytes

Delete object Total Memory:101011456 bytes

Create object Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Delete object Total Memory:117825536 bytes

Delete object Total Memory:117825536 bytes

Delete object Total Memory:117825536 bytes

Delete object Total Memory:117825536 bytes

Delete object Total Memory:117825536 bytes

Delete object Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Object moved Total Memory:117825536 bytes

Delete object Total Memory:117825536 bytes

Create object Total Memory:134639616 bytes

Object moved Total Memory:134639616 bytes

Object moved Total Memory:134639616 bytes

Delete object Total Memory:134639616 bytes

Create object Total Memory:151453696 bytes

Object moved Total Memory:151453696 bytes

Object moved Total Memory:151453696 bytes

Delete object Total Memory:151453696 bytes

Create object Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Delete object Total Memory:168267776 bytes

Delete object Total Memory:168267776 bytes

Delete object Total Memory:168267776 bytes

Delete object Total Memory:168267776 bytes

Delete object Total Memory:168267776 bytes

Delete object Total Memory:168267776 bytes

Delete object Total Memory:168267776 bytes

Delete object Total Memory:168267776 bytes

Delete object Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Object moved Total Memory:168267776 bytes

Delete object Total Memory:168267776 bytes

Create object Total Memory:185081856 bytes

Object moved Total Memory:185081856 bytes

Object moved Total Memory:185081856 bytes

Delete object Total Memory:185081856 bytes

Create object Total Memory:201895936 bytes

Object moved Total Memory:201895936 bytes

Object moved Total Memory:201895936 bytes

Delete object Total Memory:201895936 bytes

Create object Total Memory:218710016 bytes

Object moved Total Memory:218710016 bytes

Object moved Total Memory:218710016 bytes

Delete object Total Memory:218710016 bytes

Create object Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Object moved Total Memory:235524096 bytes

Delete object Total Memory:235524096 bytes

Create object Total Memory:252338176 bytes

Object moved Total Memory:252338176 bytes

Object moved Total Memory:252338176 bytes

Delete object Total Memory:252338176 bytes

Create object Total Memory:269152256 bytes

Object moved Total Memory:269152256 bytes

Object moved Total Memory:269152256 bytes

Delete object Total Memory:269152256 bytes

Create object Total Memory:285970432 bytes

Object moved Total Memory:285970432 bytes

Object moved Total Memory:285970432 bytes

Delete object Total Memory:285970432 bytes

Create object Total Memory:302784512 bytes

Object moved Total Memory:302784512 bytes

Object moved Total Memory:302784512 bytes

Delete object Total Memory:302784512 bytes

Create object Total Memory:319598592 bytes

Object moved Total Memory:319598592 bytes

Object moved Total Memory:319598592 bytes

Delete object Total Memory:319598592 bytes

Create object Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Object moved Total Memory:336412672 bytes

Delete object Total Memory:336412672 bytes

Delete object Total Memory:319610880 bytes

Delete object Total Memory:302796800 bytes

Delete object Total Memory:285982720 bytes

Delete object Total Memory:269168640 bytes

Delete object Total Memory:252354560 bytes

Delete object Total Memory:235540480 bytes

Delete object Total Memory:218726400 bytes

Delete object Total Memory:201912320 bytes

Delete object Total Memory:185098240 bytes

Delete object Total Memory:168284160 bytes

Delete object Total Memory:151470080 bytes

Delete object Total Memory:134656000 bytes

Delete object Total Memory:117841920 bytes

Delete object Total Memory:101027840 bytes

Delete object Total Memory:84213760 bytes

Delete object Total Memory:67395584 bytes

Delete object Total Memory:50581504 bytes

Delete object Total Memory:33767424 bytes

Delete object Total Memory:16953344 bytes

Delete object Total Memory:135168 bytes

Process time:1154ms

Max memory needed:336412672

Total memory that need:335544300

 

 

Max memory needed ειναι η μεγιστη μνημη που πηρε το προγραμμα για να εκτελεστει

Total memory that need ειναι η μεγιστη που μου χρειαζεται πραγματικα

 

το προγραμματακι

 

>#include <vector>
#include <time.h>
#include <algorithm>
#pragma comment(lib,"Psapi.lib")
using namespace std;

#define USE_MOVE FALSE

int objectsize = 0x00ffffff;
int objectcount = 20;
int appsize=0;
int max_total = 0;

int total()
{
 PROCESS_MEMORY_COUNTERS pi;
 pi.cb = sizeof(pi);
 GetProcessMemoryInfo(GetCurrentProcess(),&pi,sizeof(pi));
 max_total = max(max_total,pi.WorkingSetSize-appsize);
 return pi.WorkingSetSize-appsize;
}
void inittotal()
{
appsize = total();
}

class cls
{
char* bytes;
size_t size;
public:
// destructor
~cls()
{
	if(bytes != NULL)
		delete[] bytes;
	size = 0;
	cout<<"Delete object"<<"\t\t Total Memory:"<<total()<<" bytes"<<endl;
}
// constructs
cls() : bytes(NULL),size(0)
{
	cout<<"Create Defualt"<<"\t\t Total Memory:"<<total()<<" bytes"<<endl;
}
cls(size_t size) : bytes(new char[size]),size(size)
{
	cout<<"Create object"<<"\t\t Total Memory:"<<total()<<" bytes"<<endl;
}
cls(cls& c)
{
	bytes = new char[c.size];
	memcpy(bytes,c.bytes,c.size);
	size = c.size;
	cout<<"Copy object"<<"\t\t Total Memory:"<<total()<<" bytes"<<endl;
}
#if USE_MOVE
cls(cls&& c)
{
	*this = std::move(c);
	cout<<"Object moved"<<"\t\t Total Memory:"<<total()<<" bytes"<<endl;
}
#endif
//operators
cls& operator=(cls& c)
{
	bytes = new char[c.size];
	memcpy(bytes,c.bytes,c.size);
	size = c.size;
	cout<<"Copy object"<<"\t\t Total Memory:"<<total()<<" bytes"<<endl;
	return *this;
}
#if USE_MOVE
cls& operator=(cls&& c)
{
	bytes = c.bytes;
	size  = c.size;
	c.bytes = 0;
	c.size  = 0;
	cout<<"Object moved"<<"\t\t Total Memory:"<<total()<<" bytes"<<endl;
	return *this;
}
#endif

};

int _tmain(int argc, _TCHAR* argv[])
{
clock_t t = clock();
inittotal();
{
	vector<cls> c;
	for(int i = 0 ; i< objectcount;++i)
		c.push_back(cls(objectsize));
}
cout<<"Process time:"<<clock()-t<<"ms"<<endl;
cout<<"Max memory needed:"<<max_total<<endl;
cout<<"Total memory that need:"<<objectsize*objectcount<<endl;


	return 0;
}

 

 

 

Οποιος ενδιαφερεται για αυτο το "θαυμα" ας ριξει μια ματια εδω και εδω και εκει :D

Δημοσ.

Θαύμα θα ήταν αν υπηρχαν απο τώρα compilers που να υποστηριζουν 100% στο νεο ISO, και αν αυτή τη στιγμη που μιλάμε τα προγράμματά μας δεν είχαν πρόβλημα με compile σε όλα τα μηχανήματα με το τωρινό ISO. Κρίνοντας από το τί γίνεται ως τώρα, ίσως σε 5 χρόνια όλα αυτά (τα πολύ σημαντικά, όπως move ctors και lambda funs, κλπ) να ειναι tractable. Πάντως, έστω και ως τεστ, το αποτέλεσμα του move φαίνεται πολύ καλό.

Δημοσ.

Πολύ ενδιαφέρουσα η σύγκριση.

 

Όμως ο κώδικάς σου έχει δυο μικρά λάθη:

 

1) Ο copy constructor δέχεται συνήθως την παράμετρο ως const &, δηλαδή θα ήταν:

>cls(const cls& c)

 

2) [Και σημαντικότερο] Στους operator= πρέπει να διαγράφεις τη μνήμη που έχεις δυναμικά δεσμεύσει, αλλιώς μένει ξεκρέμαστη, και επίσης πρέπει να ελέγχεις αν αντιγράφεις τον εαυτό σου, οπότε δεν χρειάζεται να κάνεις τίποτα. Δηλαδή θα ήταν

 

>
       //operators
       cls& operator=(const cls& c)
       {
               if (this != &c)  {
                       delete[] bytes;

                       bytes = new char[c.size];
                       memcpy(bytes,c.bytes,c.size);
                       size = c.size;
                       cout<<"Copy object"<<"\t\t Total Memory:"<<total()<<" bytes"<<endl;
               }
               return *this;
       }
#if USE_MOVE
       cls& operator=(cls&& c)
       {
               if (this != &c)  {
                       delete[] bytes;

                       bytes = c.bytes;
                       size  = c.size;
                       c.bytes = 0;
                       c.size  = 0;
                       cout<<"Object moved"<<"\t\t Total Memory:"<<total()<<" bytes"<<endl;
               }
               return *this;
       }
#endif

 

Αυτά εξηγούνται εξίσου καλά εδώ.

Δημοσ.

Θαύμα θα ήταν αν υπηρχαν απο τώρα compilers που να υποστηριζουν 100% στο νεο ISO, και αν αυτή τη στιγμη που μιλάμε τα προγράμματά μας δεν είχαν πρόβλημα με compile σε όλα τα μηχανήματα με το τωρινό ISO. Κρίνοντας από το τί γίνεται ως τώρα, ίσως σε 5 χρόνια όλα αυτά (τα πολύ σημαντικά, όπως move ctors και lambda funs, κλπ) να ειναι tractable. Πάντως, έστω και ως τεστ, το αποτέλεσμα του move φαίνεται πολύ καλό.

 

 

Υπάρχει μερική υποστήριξη στο C++0x, κυρίως επειδή δεν είναι ακόμα standard: http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport

 

@Evgenios1: υποθέτω το έλεγξες με όλα τα optimizations και σε διαφορετικούς compilers? Κυρίως γιατί την πλεινότητα των περιπτώσεων την καλύπτουν τα Return Value Optimization (http://en.wikipedia.org/wiki/Return_value_optimization) και το Copy Elision (http://en.wikipedia.org/wiki/Copy_elision)

Δημοσ.

Υπάρχει μερική υποστήριξη στο C++0x, κυρίως επειδή δεν είναι ακόμα standard: http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport

 

@Evgenios1: υποθέτω το έλεγξες με όλα τα optimizations και σε διαφορετικούς compilers? Κυρίως γιατί την πλεινότητα των περιπτώσεων την καλύπτουν τα Return Value Optimization (http://en.wikipedia.org/wiki/Return_value_optimization) και το Copy Elision (http://en.wikipedia.org/wiki/Copy_elision)

Βασικα αυτο που εγραψα εχει να κανει με την "μετακινηση" ενους object απο τη θεση χ στη θεση ψ χωρις γινει copy, με αποτελεσμα να μην εχεις δυο object αλλα μονο ενα.

πχ

>class test
{
void* data;
int len;
public:
test()
{
	data= 0;
	len =0;
}
~test()
{
	if(data!=0)
		delete[] data;
}
test(int i)
{
	data = new char[i];
	len =i;
}
void move(test& t)
{
	t.data = data;
	t.len  = len;
	data = 0;
	len =0;
}
void copy(test& t)
{
	t.data = new char[t.len];
	memcpy(t.data,data,len);
	t.len = len;
}
void print()
{
	cout<<"Object:"<<this<<" Inner object:"<<data<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
test t1,t2;
{
	test st1(20),st2(34);
	st1.copy(t1);// t1 ειναι ενα αντιγραφο
	st2.move(t2);// t2 ειναι το st2
}//destruct st1,st2 note: το st2 ειναι κατεστραμενο
t1.print();
t2.print();
	return 0;
}

Δημοσ.

Και αυτά που έγραψα εγώ το ίδιο κάνουν. Ξέρω τι κάνουν τα move semantics, απλά αυτό που λέω είναι ότι στις περισσότερες σημαντικές περιπτώσεις οι compilers κατάφερναν να αποφύγουν επιπλέον copies.

 

Δεν αντιλέγω για την χρησιμότητα των move semantics (ίσως το μόνον που δε μπορείς να κάνεις χωρίς αυτά είναι ένα vector από non-copy constructable αντικείμενα) απλά για θέματα optimization, ήδη ο compiler κάνει πολλά προς αυτή τη κατεύθυνση.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...