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 |
Right reference (&&)
Last Updated: Aug 24 2017 09:45, Started by
virgil94
, Aug 21 2017 15:53
·
0
#1
Posted 21 August 2017 - 15:53
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:
|
#2
Posted 21 August 2017 - 19:06
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?
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
Posted 22 August 2017 - 18:11
dani.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
Posted 22 August 2017 - 18:16
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
Posted 22 August 2017 - 18:36
dani.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. 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
Posted 22 August 2017 - 18:43
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
Posted 22 August 2017 - 18:52
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
Posted 22 August 2017 - 19:00
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
Posted 22 August 2017 - 19:13
Nu prea m-am prins si sincer sa-ti spun nu am lucrat niciodata cu clang (am gasit acum o prezentare ) .
|
#10
Posted 22 August 2017 - 19:15
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. |
|
#12
Posted 22 August 2017 - 20:02
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
Posted 23 August 2017 - 09:20
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. |
#15
Posted 24 August 2017 - 09:45
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users