C++ pointer & reference ερωτηση

Θοδωρής Λύτρας thlytras at gmail.com
Mon Dec 1 20:21:05 EET 2008


Στις Δευ 01 Δεκ 2008, ο/η V13 έγραψε:
> On Monday 01 December 2008, Theodore Lytras wrote:
> > Θα ήθελα να ρωτήσω κάτι συγκεκριμένο (πάντα με την υποσημείωση οτι
> > είμαι ερασιτέχνης στον προγραμματισμό):
> >
> > Έχω σε κάποιο σημείο του κώδικά μου έναν δείκτη σε ένα αντικείμενο της
> > κλάσης foo, και δουλεύω πάνω στο δείκτη.
> > Θέλω να περάσω το αντικείμενο αυτό σε μια μέθοδο myMethod, η οποία
> > δέχεται *αναφορά* σε αντικείμενο της κλάσης foo.
> > Είναι προφανές οτι θα πρέπει να κάνω dereference τον δείκτη μου
> > (βάζοντας το αστεράκι αριστερά), και να περάσω το αντικείμενο.
> >
> > Αυτό που θέλω να ρωτήσω είναι αν αυτό το operation έχει κάποιο overhead.
> > Μήπως είναι καλύτερα να φτιάξω την μέθοδο myMethod να δέχεται (και να
> > δουλεύει με) δείκτη σε αντικείμενο foo? (Αφού ούτως ή άλλως στην
> > καλούσα συνάρτηση δουλεύω με δείκτη). Και έτσι να περνάω κατευθείαν
> > τον δείκτη?
> > Ή δεν έχει σημασία από άποψη απόδοσης/efficiency?
>
> Kata 99% exoyn akribos to idio apotelesma mexri teleytaioy bit, ektos kai
> an exeis kanei overload kapoion apo toys operator &, operator *.
>
> Mporeis na to deis kai kanontas compile ta dyo parakato programmata:
>
> -----
> #include <iostream>
> using namespace std;
> class A { public: int   x; A() : x(5) {} };
> void print(A &a) { cout << a.x << endl; }
> int main() { A  a; print(a); }
> -----
> #include <iostream>
> using namespace std;
> class A { public: int   x; A() : x(5) {} };
> void print(A *a) { cout << a->x << endl; }
> int main() { A  a; print(&a); }
> -----
>
> kai meta strip kai sygkrisi:
>
> $ g++ a.cc -o a
> $ g++ b.cc -o b
> $ strip a b
> $ diff a b && echo Same
> Same

Κατάλαβα, ευχαριστώ, καλύφθηκα! Το δοκίμασα κιόλας.
Ο compiler τα μεταφράζει στον ίδιο ακριβώς κώδικα μηχανής.

Μάλιστα τροποποίησα ελαφρώς το παράδειγμά σου για να είναι ακριβώς το ίδιο με 
αυτό που αντιμετωπίζω εγώ:

-----
#include <iostream>
using namespace std;
class A { public: int   x; A() : x(5) {} };
void print(A &a) { cout << a.x << endl; }
int main() { A * a = new A; print(*a); delete(a); }
-----
#include <iostream>
using namespace std;
class A { public: int   x; A() : x(5) {} };
void print(A *a) { cout << a->x << endl; }
int main() { A * a = new A; print(a); delete(a); }
-----

και φυσικά το αποτέλεσμα είναι και πάλι ίδιο.

Επομένως δεν υπάρχει overhead από το dereferencing του pointer και το πέρασμα 
του αντικειμένου ως reference. Επομένως η χρήση (και μίξη) pointer και 
reference συνάγω οτι είναι θέμα στυλιστικό μόνο.

Και πάλι ευχαριστώ,

Θοδωρής

-- 
"Beauty is transitory"
"Beauty survives"
        - Mr. Spock & Capt. Kirk, "That which survives", stardate unknown
by Theodore Lytras <thlytras at gmail.com>


More information about the Linux-greek-users mailing list