Przekazywanie referencji do wektora

0

Przerabiam pewien program w C++ i pewna operacja wygląda mniej więcej tak:

Plik H

class KlasaWykonawczaOperacji
{
    vector<char> Dane;
    void PodajDane(vector<char> &Blob);
    void PobierzWynik(vector<char> &Blob);
    void Czynnosc1();
    void Czynnosc2();
    void Czynnosc3();
    static void KlasaWykonawczaOperacji::WykonajOperacje(vector<char> &Blob);
}

Plik CPP

void PodajDane(vector<char> &Blob)
{
    Dane = Blob;
}

void PobierzWynik(vector<char> &Blob)
{
    Blob = Dane;
}

void Czynnosc1()
{
    // Jakies operacje na wektorze Dane
}

void Czynnosc2()
{
    // Jakies operacje na wektorze Dane
}

void Czynnosc3()
{
    // Jakies operacje na wektorze Dane
}

void WykonajOperacje(vector<char> &Blob)
{
    KlasaWykonawczaOperacji Obj;
    Obj.PodajDane(Blob);
    Obj.Czynnosc1();
    Obj.Czynnosc2();
    Obj.Czynnosc3();
    Obj.PobierzWynik(Blob);
}

Generalnie chodzi o to, że mam wektor i wykonuje na nim pewne operacje w ten sposób, że tworzę obiekt, wprowadzam do pola globalnego wektor danych, wykonuję jakieś czynności i wyciągam wynik. W rzeczywistości metod jest dużo więcej i wiele z nich operuje na polach globalnych, więc ciężko zrezygnować z pola globalnego danych.

Wszystko jest dobrze, ale zauważyłem, że instrukcja zawarta w metodach PodajDane i PobierzWynik tak naprawdę kopiuje wektor, co przy bardzo dużych wektorach może mieć znaczenie jeśli chodzi o zajętość programu. Natomiast myślałem nad zrobieniem pola vector<int>* na stercie, ale tu jest inny problem, mianowicie obiekt na stercie ma dłuższy czas dostępu, co obniża wydajność programu, przynajmniej teoretycznie, tak pisze chyba każdy tutorial c++ w temacie różnicy między obiektem na stosie i na stercie.

Jak przerobić program, a szczególnie metody PodajDane i PobierzWynik, żeby przekazać wektor tak, żeby wszystkie czynności odbywały się na tym sam egzemplarzu wektora, który jest podawany jako argument metody WykonajOperacje a jednocześnie, żeby dostęp do wektora był jak najszybszy? Teoretycznie po tej przeróbce, metoda PobierzWynik przestanie być potrzebna.

Próbowałem też wykorzystać metodę "assign" dostępną dla obiektu wektora, ale z tego, co zauważyłem, ona również robi kopię zawartości pamięci, do której wskaźnik się podaje, co mija się z celem.

0

Po pierwsze, zmierz sobie czas, czy faktycznie jest to dla Ciebie problematyczne.

myślałem nad zrobieniem pola vector<int>* na stercie, ale tu jest inny problem, mianowicie obiekt na stercie ma dłuższy czas dostępu, co obniża wydajność programu
I tak do tego wektora się odnosisz poprzez kilka wskaźników (this->wektor->private_wskaźnik_na_dane), jedna dereferencja więcej nie powinna robić aż takiej różnicy jeśli innych operacji jest dużo.

Czy funkcja PobierzDane może zostawiać wartość Blob w stanie nieokreślonym, a funkcja PobierzWynik wartość Dane w stanie nieokreślonym? Wtedy możesz użyć std::move i zamiast kopii masz praktycznie darmowe przeniesienie. Jeśli nie, wybierz wskaźnik odpowiadający Twoim potrzebom (najpewniej unique_ptr lub smart_ptr) użyj go, i sprawdź jak wpływa na wydajność.

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