Qt, Zwracanie wektora przez funkcje

0

Hej!

Potrzebuję napisać funkcję która obrobi w pewien sposób 2 wektory i zwróci wynik:

void liczaj(const QVector<double> &a, const QVector<double> &b){
  // licze
}

Dane przekazuję przez referencję, aby niepotrzebnie kopiować/mielić w pamięci. Pytanie: jak zwrócić wynik?

Mógłbym to zrobić przez argument np:

void liczaj(const QVector<double> &a, const QVector<double> &b, QVector<double> &c){
  // licze
}

Lecz wydaje mi się że są lepsze(nowsze) metody, żeby zwrócić np. przez return.
Problem też taki, że przekazując w ten sposób przez argument, nie wiem jak ustawić konkretną wielkość, brakuje mi takiego:

c.setSize(100); // tylko funkcja liczaj będzie znać długość wektora, będzie obliczana na podstawie danych wejściowych

Boję się zastosować tego rozwiązania:

c.clear();
for(int i = 0; i<n; ++i){
  c.append(12); // przykład
}

Ponieważ myślę, że ciągle będzie jakieś alokowanie i zwalnianie pamięci.

Potrzebuję mieć funkcję zoptymalizowaną pod kątem prędkości wykonywania.

2

Może czegoś nie rozumiem

QVector<double> liczaj(const QVector<double> &a, const QVector<double> &b){
  QVector<double> wynik;

//liczenie i dodawanie do wynik

   return wynik;
}

Co do obaw o alokowanie i zwalnianie
http://doc.qt.io/qt-5/qvector.html#reserve

0

Jest sobie pewna klasa która posiada:

private:
  QVector<double> mResult;

W wątku w pętli wykonywać się będzie cyklicznie:

mResult =  liczaj(a, b);

Przeważnie długość wyniku będzie taka sama, od czasu do czasu może się zmienić(raz na 5min)

Czy funkcja:

QVector<double> liczaj(const QVector<double> &a, const QVector<double> &b){
  QVector<double> wynik;
 
//liczenie i dodawanie do wynik
 
   return wynik;
}

Nie zaalokuje pamięci:

  QVector<double> wynik;

A przy return zwolni pamięć mResult, zaalokuje nową przestrzeń, przekopiuje z "wynik" i zwolni "wynik"?

Wektory będą miały długość kilku milionów elementów, jeśli przeważnie będzie stała długość, chciałbym uniknąć niepotrzebnego alokowania i zwalniania.

0
  1. Zrób prosto. Np tak jak ja pokazałem.
  2. Odpal aplikację.
  3. Jeżeli aplikacja za wolno działa
    3.1 Odpal profiler
    3.2 Jeżeli rzeczywiście muli na tej funkcji to dopiero ją optymalizuj
0

Przecież QVector implementuje move semantics, więc zwracanie takiego obiektu przez return jest tanie jak barszcz.

0

Dzięki, będę wszystko testował.
Nie chcę zakładać nowego tematu, mam szybkie krótkie pytanko:
jak sprawdzić zużycie procesora przez program w QT?
Chodzi mi o to, żeby w aplikacji wyświetlało się zużycie procesora, jakie ta właśnie aplikacja zużywa.

0
twonek napisał(a):

Przecież QVector implementuje move semantics, więc zwracanie takiego obiektu przez return jest tanie jak barszcz.

QVector implementuje copy on write, czyli nawet bez C++11 zwracanie przez wartość nie powoduje niepotrzebnego kopiowania danych.

0

Ba w całym Qt przyjęto taką filozofię (copy on write). Także QString, QList... Jeszcze przed C++11...

Np. dopiero w Qt 5.* zaczęto wykorzystywać masowo STL'a (np. algorytymy). W 4.* jeszcze było wymyślane koła na nowo aby odczepić się od różnic w kompilatorach. Teraz (od 5.0) jest oficjalna wykładnia by odchodzić od implementacji algorytmów Qt. Nawet (technicznie) moc już nie jest (prawie) potrzebny bo mechanizmy szablonowe i metaprogramowanie mogło by sobie poradzić, ale moc jeszcze będzie przez dłuższy czas bo za duży nakład na zmianę...

Ups... mały off-top :-) Ale może się komuś przyda :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1