C++-alocarea dinamica a unor membri/supraincarcare operatori


(Stefan Davidoaia) #22

mersi enorm!am reușit !le-am încâlcit eu!
modificări în funcție(am ales deep-copy pană la urmă)

Matrice& Matrice::operator=(const Matrice& matrice)
{
	

	for (unsigned int i = 0; i < nrLinii_ * nrColoane_; ++i)
	{
		valori_[i] += matrice.valori_[i];
	}

	return *this;
}

Matrice Matrice::operator+(const Matrice& matrice) const
{
	Matrice copie(*this);
	copie = matrice;

	return copie;
}

+constructor de copiere

Matrice::Matrice(const Matrice& matrice) : nrLinii_(matrice.nrLinii_), nrColoane_(matrice.nrColoane_), valori_(new int[nrLinii_ * nrColoane_])
{
	for (unsigned int i = 0; i < nrLinii_ * nrColoane_; ++i)
	{
		valori_[i] = matrice.valori_[i];
	}
}

tot respectul serghei !sărbători fericite în continuare!


(Serghei Amelian) #23

E ok şi deep-copy, dar când ai cantităţi foarte mari de date, consumi foarte mult CPU şi RAM prin alocarea suplimentară şi copiere. N-ar fi rău să aprofundezi şi să înţelegi move-semantics şi tehnica copy-on-write (CoW).

CoW este o tehnică folosită foarte frecvent în C/C++, unde nu “furi” pointerul ci iniţial îl partajezi între sursă şi destinaţie şi incrementezi o referinţă. Când unul dintre obiecte este distrus, nu şterge memoria alocată, ci decrementează referinţa. Când referinţa ajunge la zero (adică nu mai există niciun obiect care să aibă nevoie de memoria alocată), memoria este eliberată. Totuşi, ce se întamplă dacă ai nevoie să modifici content-ul unui obiect? Ei bine, de aici vine denumirea de “copy-on-write”, în momentul în care care scrii ceva în obiectul ăla, abia atunci îţi faci o copie a datelor iniţiale şi decrementezi referinţa.


(Stefan Davidoaia) #24

Foarte tare această tehnică !chiar sunt foarte curios și o să ma documentez!mulțumesc din nou pentru ajutor și,pentru perspectiva noua oferita și diversele suporturi oferite!lucrurile sunt mai interesante decât la facultate!