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