Re[5]: ссылка на локальный вектор
От: uzhas Ниоткуда  
Дата: 16.05.16 13:08
Оценка: 1 (1)
Здравствуйте, sci_reseacher, Вы писали:

_>наверное лучший вариант переделать базовый класс

_>

_>struct B {
_>    virtual vector<float> getX() = 0 ;
_>};

_>struct C: public B {
_>    float *X;
_>    int size;

_>    virtual vector<float> getX(){
_>        vector<float> tmp(X,X+size);
_>        return tmp;
_>    }
_>};

_>struct D: public B {
_>    vector<float> X;
_>    virtual vector<float>  getX(){
_>        return X;
_>    }
_>};
_>


_>и использовать так

_>
_>const vector<float> & w = d.getX(); // только вот здесь нет ли лишней копии вектора?
_>


тут возможны альтернативы.
нужно оценить, насколько негативно в плане производительности, будет возврат вектора по значению. сколько там элементов ? как часто зовется ?
попробую набросать другие варианты:
1)
struct B {
  virtual void getX(vector<float>& result) = 0; <-- при таком подходе можно выиграть на аллокациях, если входной вектор имеет нужный capacity
};


2) оторвать указатель и размер от хранилища, которое владеет памятью
struct B {
  virtual float* getXBegin() = 0;
  virtual size_t getXSize() = 0;
};


3) можно объединить размер и указатель
struct B {
  virtual pair<float*, size_t> getX() = 0;
};


4) либо сделать\заюзать аналог array_view/string_view/string_ref/ link: http://stackoverflow.com/questions/34832090/whats-the-difference-between-span-and-array-view-in-the-gsl-library

5) либо прокинуть функтор для итерации по контейнеру (поэлементно, либо некими группами\страницами)
struct B {
  virtual void processX(std::function<float> f) = 0; //<-- f will be invoked for each "float" value
};


успехов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.