przeniesienie zamiast kopiowania

przeniesienie zamiast kopiowania
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
class KlasaBuffer
{
public:
	std::vector<int> bigArray;

	void load()
	{
		bigArray.reserve(1024);
	}
};
class Klasa
{
	std::vector<int> bigArray;
public:

	Klasa(KlasaBuffer&& buffer)
		: bigArray(buffer.bigArray)
	{

	}
};
int main()
{
	KlasaBuffer buffer;
	buffer.load();

	Klasa klasa(std::move(buffer));
}

Czy to jest dobrze napisane? Chciałbym uniknąć kopiowania bigArray, nie za bardzo wiem kiedy używać std::move oraz &&.

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1

W tej chwili kopiujesz. Potrzebujesz

Kopiuj
bigArray(move(buffer.bigArray))
  • Rejestracja: dni
  • Ostatnio: dni
0

Czy teraz jest to poprawne? @_13th_Dragon Nie wiem, Buffer nie jest mi potrzebny po przeniesieniu tej tablicy i moze zostać zniszczony.

Kopiuj
class KlasaBuffer
{
public:
    std::vector<int> bigArray;
 
    void load()
    {
        bigArray.reserve(1024);
    }
};
class Klasa
{
    std::vector<int> bigArray;
public:
 
    Klasa(KlasaBuffer& buffer) // referencja
        : bigArray(std::move(buffer.bigArray))
    {
 
    }
};
int main()
{
    KlasaBuffer buffer;
    buffer.load();
 
    Klasa klasa(buffer);
}
  • Rejestracja: dni
  • Ostatnio: dni
0

Jeśli dobrze rozumiem to przeniesienie polega na zmianie adresu do tych bajtów a nie samych bajtów.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Wsadź sobie load() do konstruktora, po czym używaj jako: Klasa klasa(KlasaBuffer()); - wtedy to ma jakiś tam sens, przy odpowiedniej rozbudowie.

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1
Kopiuj
Klasa(KlasaBuffer& buffer)

Bez sensu. Dobrze było z &&.

Kopiuj
Klasa klasa(buffer);

Drugie bez sensu. Musisz stosować move na zmiennej, żeby powiedzieć kompilatorowi, że chcesz przenieść jej zawartość do czegoś innego. Ew. używać zmiennej tymczasowej tak jak @_13th_Dragon zasugerował.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.