Welcome, Guest. Please login or register.

Autor Subiect: C++ -> conventii pentru transmiterea argumentelor  (Citit de 3249 ori)

0 Membri şi 1 Vizitator vizualizează acest subiect.

astan

  • Vizitator
C++ -> conventii pentru transmiterea argumentelor
« : Ianuarie 23, 2012, 12:59:10 a.m. »
Lucrez la o biblioteca scrisa in C++ si ma intreb in ce masura anumite conventii de codare pe care le folosesc eu sunt folosite si de altii.

In acest sens am cateva intrebari:

1. Voi preferati transmiterea argumentelor de tip shared_ptr prin valoare sau prin referinta (const ref, mai precis) ? Aparent, uitandu-ma peste codul unor biblioteci existente, in multe cazuri se prefera transmiterea argumentelor de tip shared_ptr prin valoare.
Acest lucru duce la pierderi de performanta ...

Mai precis, voi cum procedati:

void func(shared_ptr<MyType> my_object)
{
...
}
sau
void func(const shared_ptr<MyType>& my_object)
{
...
}

2. Prespununand ca scriem o clasa care are un membru de tip pointer catre un anumit obiect alocat dinamic, iar clasa respectiva este owner-ul obiectului respectiv. In acest caz, cum procedati : folositi scoped_ptr sau shared_ptr pentru a tine membrul respectiv ?
Solutia "clasica" ar fi fost sa tin un pointer raw si sa fac delete in destructor, dar in dezvoltarea moderna se prefera sa se tina membri ca pointeri raw doar daca clasa nu e implicata in ownership-ul obiectului indicat de pointer, ci doar il acceseaza (presupunand ca e "live" mereu).

Sintetizand, cum procedati:

class MyClass
{
...
private:
scoped_ptr<OtherType> m_pointer_to_type;
}

sau

class MyClass
{
...
private:
shared_ptr<OtherType> m_pointer_to_type;
}

daca MyClass e owner exclusiv al lui m_pointer_to_type ?

Prefer sa folosesc scoped_ptr, pentru a transmite faptul ca MyClass e owner exclusiv ... voi cum procedati ?

3. Presupunand ca o functie ar trebui sa primeasca ca parametru un obiect pe care nu il stocheaza, ci doar il modifica.
Preferati sa transmiteti respectivul obiect prin pointer raw sau prin shared_ptr ?
Preferati sa folositi shared_ptr doar pentru a indica ca functia este implicata in ownership-ul obiectului sau preferati, pe cat posibil, sa folositi shared_ptr in loc de pointeri raw (chiar daca functia nu afecteaza ownership-ul obiectului) ?
Prespunem ca e legal sa trimit si NULL, deci nu se poate folosi o referinta.

4. In cazul unei functii de tip factory, care creaza dinamic un obiect si il intoarce catre client, care e tipul de return pe care il folositi ? Pointer raw, shared_ptr, sau auto_ptr ?
Mentionez ca nu pot folosi unique_ptr.

5. In momentul in care doriti sa transmiteti un pointer ca parametru intr-un constructor si clasa devine owner al acelui pointer, clientul neavand nevoie sa-l foloseasca dupa ce l-a transmis, obisnuiti sa transmiteti obiectul folosind auto_ptr (pentru a semnaliza cedarea de ownership) ?

Va multumesc.
« Ultima Modificare: Ianuarie 23, 2012, 01:32:58 p.m. de astan »

HarapAlb

  • Vizitator
Răspuns: C++ -> conventii pentru transmiterea argumentelor
« Răspuns #1 : Februarie 03, 2012, 02:29:07 a.m. »
1. Daca inteleg bine exemplul tau e vorba de "pointer" vs. "referinta catre pointer". Nu cred ca la nivel de performanta sa se observe diferente semnificative, pana la urma referinta catre un obiect este tot un fel de pointer insa ceva mai special. Pe de alta parte folosirea pointerilor are avantajul ca in unele situatii pot fi NULL.

astan

  • Vizitator
Răspuns: C++ -> conventii pentru transmiterea argumentelor
« Răspuns #2 : Februarie 07, 2012, 01:02:46 p.m. »
Multumesc pentru raspuns.