哪种方式适合返回类数组?
class BigSizeClass {
int data[1024 * 1024];
};
非常糟糕且昂贵的方式:
CArray<BigSizeClass> test() {
CArray<BigSizeClass> ret;
for(int i = 0; i < 1024; i++) {
BigSizeClass c;
ret->Add(c);
}
return ret;
}
可能是我忘了删除返回值:
CArray<BigSizeClass>* test() {
CArray<BigSizeClass>* ret = new CArray<BigSizeClass>();
for(int i = 0; i < 1024; i++) {
BigSizeClass c;
ret->Add(c);
}
return ret;
}
可能我喜欢昂贵:
// 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;
}
可能是我忘了删除对象:
CArray<BigSizeClass*> test()
{
CArray<BigClassSize> ret;
for(int i = 0; i < 1024; i++)
{
BigSizeClass* c = new BigSizeClass;
ret->Add(c);
}
return ret;
}
答案 0 :(得分:1)
方式1很好。 RVO和NRVO将在这里开始。即使它没有,你仍然可以“互换”,假设CArray做了聪明的事情,并且有交换功能。
CArray<BigSizeClass> result;
test().swap(result);
但是,我不得不建议不要使用CArray-它不使用复制构造函数,而是使用memcpy
,这对于任何非POD类都是可怕的未定义行为。
答案 1 :(得分:1)
在C ++ 11中,您可以使用R值引用。不幸的是CArray
没有用r值语义实现。您应该使用可识别R值/移动语义的STL容器。
如果可以使用R值,您可以从函数返回整个vector<BigSizeClass>
- 向量类将负责复制(移动)返回的向量。