如何返回CArray?

时间:2011-06-19 13:38:29

标签: c++ arrays mfc return-value return-type

哪种方式适合返回类数组?

class BigSizeClass {
    int data[1024 * 1024];
};
  1. 非常糟糕且昂贵的方式:

    CArray<BigSizeClass> test() {
      CArray<BigSizeClass> ret;
      for(int i = 0; i < 1024; i++) {
        BigSizeClass c;
        ret->Add(c);
      }
      return ret;
    }
    
  2. 可能是我忘了删除返回值:

    CArray<BigSizeClass>* test() {
      CArray<BigSizeClass>* ret = new CArray<BigSizeClass>();
      for(int i = 0; i < 1024; i++) {
        BigSizeClass c;
        ret->Add(c);
      }
      return ret;
    }
    
  3. 可能我喜欢昂贵:

    // 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;
    }
    
  4. 可能是我忘了删除对象:

    CArray<BigSizeClass*> test()
    {
      CArray<BigClassSize> ret;
      for(int i = 0; i < 1024; i++)
      {
        BigSizeClass* c = new BigSizeClass;
        ret->Add(c);
      }
      return ret;
    }
    

2 个答案:

答案 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> - 向量类将负责复制(移动)返回的向量。