Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cum sa elimini urmele de acnee?

Wc Geberit

Routere detinute in trecut si in ...

Teii din fața casei
 E-Mail in serie prin Excel si Out...

Modul alimentare rulou/jaluzea ex...

Recuperare fișiere dupa form...

Aplicatii stress test RAM
 Asigurare auto hibrid

Asus B550M - PC-ul nu porneste di...

Tzanca Uraganu - Inconjurat de Fe...

explicatie montaj breadboard
 3 Doors Down - Kryptonite

Semnalizati cand virati pe un dru...

Succesiune - mostenire apartament...

Donez Siofor de 1000mg ( diabet t...
 

Right reference (&&)

- - - - -
  • Please log in to reply
14 replies to this topic

#1
virgil94

virgil94

    Junior Member

  • Grup: Members
  • Posts: 66
  • Înscris: 08.08.2017
Salut,

Incerc sa inteleg putin cum functioneaza && si nu inteleg de ce spun ca in cazul constructorului de egalitate de exemplu se evita realocarea memoriei in cazul in care as avea niste pointeri sa zicem.
O data ce in constructorul = folosesti & obiectul este transmis prin referinta, lucrezi direct cu adresa lui ceea ce nu mai implica o realocare a obiectului curent, nu-i asa?
Nu inteleg ce face in plus && de vreme ce & insasi nu implica nici o copiere si nici o realocare.
Am citit de aici: Daca mai are cineva vreo resursa care sa ma lamureasca ar fi super.

#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
Ai sa zicem un vector cu 1 milion de elemente. Transmiti vectorul acela unei clase ce ar nevoie de el pentru mai mult timp. Ce faci, tinand cont ca sursa ce a creat vectorul nu mai are nevoie de el?
  • Transmiti by-value, facand o copie, consumi ceva resurse
  • Transmiti by-reference (sau ca pointer), clasa il poate folosi, dar nu il poate retine fara sa-i faca o copie, ca nu stie cand brusc e dezalocata memoria pentru acel vector
Solutia: transmiti ca &&, iar clasa il muta la ea. Un fel de "ia-l frate ca nu mi-l mai trebuie". (Mai e si solutia cu transmiterea unui shared_pointer, dar aia mai tarziu).

Apoi mai are si alta utilitate &&. Daca ai:

C foo() { return {}; }
void bar(C&) { }


Nu poti apela direct
bar(foo);


Trebuie variabila intermediara sau sa folosesti const C&. Cu && se poate.

Edited by dani.user, 21 August 2017 - 19:14.


#3
virgil94

virgil94

    Junior Member

  • Grup: Members
  • Posts: 66
  • Înscris: 08.08.2017

View Postdani.user, on 21 august 2017 - 19:06, said:

Solutia: transmiti ca &&, iar clasa il muta la ea. Un fel de "ia-l frate ca nu mi-l mai trebuie". (Mai e si solutia cu transmiterea unui shared_pointer, dar aia mai tarziu).

Ok, are sens ce ai explicat (mersi) dar totusi nu e copiat mai departe acelasi pointer...uite exemplul de pe stack...

foo(foo&& other)
{
   this->length = other.length;
   this->ptr = other.ptr;
   other.length = 0;
   other.ptr = nullptr;
}


Obiectul curent retine pointerul indicat de other, daca other este sters implicit si obiectul curent o sa piarda datele, nu prea inteleg cum il poate pasa altei clase care sa foloseasca datele independent de obiectul initial.

#4
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
Copierea unui pointer e o nimica toata, dureaza infinit mai putin decat copierea intregului vector.
Daca other e sters, nu se pierd datele, ca other.ptr e suprascris cu alta valoare, other nu mai stie ce pointer avea inainte, deci nu poate sterge datele pe care acum se bazeaza cealalta instanta.

#5
virgil94

virgil94

    Junior Member

  • Grup: Members
  • Posts: 66
  • Înscris: 08.08.2017

View Postdani.user, on 22 august 2017 - 18:16, said:

Copierea unui pointer e o nimica toata, dureaza infinit mai putin decat copierea intregului vector.
Daca other e sters, nu se pierd datele, ca other.ptr e suprascris cu alta valoare, other nu mai stie ce pointer avea inainte, deci nu poate sterge datele pe care acum se bazeaza cealalta instanta.
Super asa e, acum am inteles de ce proprietățillor le-au fost atribuite 0 respectiv nullptr. Daca other ar fi rămas și el cu posibilitatea modificăii elementelor asta ar fi fost o problemă neplăcută.

Acum mai vine o întrebare, poate la fel de neînspirată ca prima...de ce să nu fac asta si cu referințe stânga...
foo(foo& other)
{
   this->length = other.length;
   this->ptr = other.ptr;
   other.length = 0;
   other.ptr = nullptr;
}



#6
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
De exemplu fiindca nu iti va compila codul de mai sus "Nu poti apela direct", iar daca-i pui "const foo&", nu te mai lasa sa modifici campuri ale lui other.

#7
virgil94

virgil94

    Junior Member

  • Grup: Members
  • Posts: 66
  • Înscris: 08.08.2017
Am facut un mic test care complileaza ...
class test
{
public:
test(test&other);
test();
private:
int a;
int b;
};
test::test(test& other)
{
this->a = other.a;
this->b = other.b;
other.a = 0;
other.b = 0;
}
test::test()
{
a = 0;
b = 0;
}

int main()
{
test t();
test t2(test t3());
return 0;
}



#8
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
Compileaza dar nu-i deloc ce pare, parantezele acelea declara defapt functii. Detalii in AST-ul generat de clang
`-FunctionDecl 0xaf84740088 <line:23:1, line:28:1> line:23:5 main 'int (void)'
  `-CompoundStmt 0xaf84742578 <line:24:1, line:28:1>
	|-DeclStmt 0xaf84740288 <line:25:1, col:9>
	| `-FunctionDecl 0xaf847401e0 parent 0xaf846ea230 <col:1, col:8> col:6 t 'class test (void)'
	|-DeclStmt 0xaf84742520 <line:26:1, col:19>
	| `-FunctionDecl 0xaf84742470 parent 0xaf846ea230 <col:1, col:18> col:6 t2 'class test (class test (*)(void))'
	|   `-ParmVarDecl 0xaf84740320 <col:9, col:17> col:14 t3 'class test (*)(void)':'class test (*)(void)'
	`-ReturnStmt 0xaf84742560 <line:27:1, col:8>
	  `-IntegerLiteral 0xaf84742538 <col:8> 'int' 0



#9
virgil94

virgil94

    Junior Member

  • Grup: Members
  • Posts: 66
  • Înscris: 08.08.2017
Nu prea m-am prins si sincer sa-ti spun nu am lucrat niciodata cu clang (am gasit acum o prezentare ) .:D

#10
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
test t2(test t3());
ce ai scris tu se traduce prin: declara o functie numita t2, care returneaza o instanta de tip test si primeste drept parametru un pointer t3 la o functie ce nu primeste nici un parametru si returneaza tot instanta de tip test

Edited by dani.user, 22 August 2017 - 19:19.


#11
virgil94

virgil94

    Junior Member

  • Grup: Members
  • Posts: 66
  • Înscris: 08.08.2017
Insist acum asupra subiectului, mersi :D

#12
virgil94

virgil94

    Junior Member

  • Grup: Members
  • Posts: 66
  • Înscris: 08.08.2017
Ma ajuti putin ca nu ma prind...cum ar trebui apelat pentru right si left ref, vreau sa-l fac sa nu mearga si nu pot.:))
Dupa cum e definit constructorul de copiere ii trebuie doar un alt obiect de tipul respectiv.

#13
virgil94

virgil94

    Junior Member

  • Grup: Members
  • Posts: 66
  • Înscris: 08.08.2017
In exemplul acesta cum ar trebui chemat si move constructor?
#include <iostream>
using namespace std;
class A
{
public:
A() :m_a(0), m_pa(nullptr) { cout << "consturctor call" << endl; };
~A() { cout << "desturctor call" << endl; };
A(A& other) :m_a(0), m_pa(nullptr)
{
  cout << "copy constructor" << endl;
}
A(A&& other) :m_a(0), m_pa(nullptr)
{
  cout << "move constructor" << endl;
}
private:
int m_a;
int* m_pa;
};
int main()
{
A(test2);//constructor
A test4(test2);//copy constructor
//? - move constructor
return 0;
}



Edited by virgil94, 23 August 2017 - 09:22.


#14
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
A test5(std::move(test2));



#15
virgil94

virgil94

    Junior Member

  • Grup: Members
  • Posts: 66
  • Înscris: 08.08.2017

View Postdani.user, on 23 august 2017 - 17:57, said:

A test5(std::move(test2));

Dap, m-am prins in cele din urma cum merge &&.
Mersi Daniel :)

Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate