Как вернуть CArray? - PullRequest
       23

Как вернуть CArray?

1 голос
/ 19 июня 2011

Какой способ подходит для возврата массива классов?

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 ]

1 голос
/ 19 июня 2011

В C ++ 11 вы можете использовать ссылки на R-значения.К сожалению, CArray не реализован с семантикой r-значения.Вы должны использовать контейнеры STL, которые знают семантику R-значения / перемещения.

Вы можете, если можно использовать R-Value, вернуть целую vector<BigSizeClass> из функции - векторный класс позаботится о копировании ( перемещение ) возвращенного вектора.

1 голос
/ 19 июня 2011

Путь 1 просто отлично. RVO и NRVO пнут здесь. Даже если этого не произойдет, вы все равно сможете «swaptimize», предполагая, что CArray делает умную вещь и имеет функцию подкачки.

CArray<BigSizeClass> result;
test().swap(result);

Однако я бы рекомендовал не использовать CArray - он не использует конструктор копирования, а вместо этого использует memcpy, что является ужасно неопределенным поведением для любых не POD-классов.

...