Which way is good for returning an array of classes?
class BigSizeClass {
int data[1024 * 1024];
};
-
Very bad and expensive way:
CArray<BigSizeClass> test() { CArray<BigSizeClass> ret; for(int i = 0; i < 1024; i++) { BigSizeClass c; ret->Add(c); } return ret; } -
may be I forget delete returning value:
CArray<BigSizeClass>* test() { CArray<BigSizeClass>* ret = new CArray<BigSizeClass>(); for(int i = 0; i < 1024; i++) { BigSizeClass c; ret->Add(c); } return ret; } -
may be I do like Expensive:
// CArray<BigSizeClass> r = test(); --> Expensive // CArray<BigSizeClass>& r = test(); --> Not Expensive (Correct - because of &) CArray<BigSizeClass>& test() { CArray<BigSizeClass>* ret = new CArray<BigSizeClass>(); for(int i = 0; i < 1024; i++) { BigSizeClass c; ret->Add(c); } return *ret; } -
may be I forget remove objects:
CArray<BigSizeClass*> test() { CArray<BigClassSize> ret; for(int i = 0; i < 1024; i++) { BigSizeClass* c = new BigSizeClass; ret->Add(c); } return ret; }
Way 1 is just fine. RVO and NRVO will kick in here. Even if it doesn’t you can still “swaptimize”, assuming that CArray does the smart thing and has a swap function.
However, I’d have to recommend against the use of CArray- it doesn’t use the copy constructor but instead uses
memcpy, which is hideously undefined behaviour for any non-POD classes.