this_is_madness Δημοσ. 16 Μαΐου 2012 Δημοσ. 16 Μαΐου 2012 εχω την εξης απορια:εστω η δηλωση double test(int,int) και η δηλωση double& test(int,int) και εκχωρω το αποτελεσμα των κλησεων σε μια μεταβλητη.Γιατι η δευτερη δηλωση χρησιμοποιει λιγοτερη μνημη απο την πρωτη? το γοογλαρα αλλα δεν βρηκα τιποτα
nilosgr Δημοσ. 16 Μαΐου 2012 Δημοσ. 16 Μαΐου 2012 μηπως εννοεις: double* test(int,int) Αν ναι, τοτε ειναι λογικο, αφου ειναι δεικτης-σε-double, οποτε εχει μεγεθος 32bit*, ενω ο "κανονικος" double εχει μεγεθος 64bit *εφ οσον βρισκεσε σε περιβσλλον x86
ChRis6 Δημοσ. 16 Μαΐου 2012 Δημοσ. 16 Μαΐου 2012 Η συναρτηση επιστρεφει reference σε double ΕΔΙΤ: Και για να απαντησω , πολλες φορες προτιμας να επιστρεψεις reference σε ενα αντικειμενο παρα κανεις copy το αντικειμενο εαν ειναι πολυ μεγαλο ΕΔΙΤ2: Αντιστοιχα περνας reference στα ορισματα της συναρτησης αντι να κανεις copy
this_is_madness Δημοσ. 16 Μαΐου 2012 Μέλος Δημοσ. 16 Μαΐου 2012 παραθετω ακριβως αυτο που διαβαζω: double& max(double x[],int n) { int m; int thmax=0; for(m=1; m<=n-1; m++) {if(x[m]>x[thmax]) thmax=m;} return x[thmax]; } και στην συνεχεια στη main εχει την εκχωρηση zm=max(z,8) και μου λεει οτι σε αυτη την περιπτωση εχουμε μια αντιγραφει βελους και μια αντιγραφη τιμης ,ενω στην αλλη περιπτωση(χωρις &) εχουμε δυο επιστροφες και δυο αντιγραφες.(δεν καταλαβαινω )
V.I.Smirnov Δημοσ. 16 Μαΐου 2012 Δημοσ. 16 Μαΐου 2012 Με λίγα λόγια : Αμφότερες οι double test(int,int) και double& test(int,int) δέχονται τα ορίσματα με τιμή. Άρα δημιουργούν αντίγραφα των δύο int κατά την κλήση τους. Η πρώτη επιστρέφει ένα int με τιμή, οπότε κατά την επιστροφή της δημιουργεί ένα "αντικείμενο" τύπου int. Η δεύτερη επιστρέφει ένα int με αναφορά, δηλ. το αντικείμενο int που έχει δημιουργήσει εσωτερικά. Αρα κατά την επιστροφή της δεν δημιουργεί κάτι επιπλέον και δεν καταναλώνει και επιπλέον μνήμη γι αυτό. Αυτό όμως είναι ασφαλές μόνον αν το αντικείμενο που επιστρέφεται έχει "διάρκεια ζωής" και έξω από την συνάρτηση. -
this_is_madness Δημοσ. 16 Μαΐου 2012 Μέλος Δημοσ. 16 Μαΐου 2012 νομιζω πως καταλαβα ,σας ευχαριστω πολυ που ασχοληθηκατε παιδια.
defacer Δημοσ. 17 Μαΐου 2012 Δημοσ. 17 Μαΐου 2012 Βασικά αυτό που διαβάζεις ασχολείται με τα δέντρα και χάνει το δάσος. Στην πραγματικότητα: Όποιος πει ότι μπορεί να εγγηθεί ότι η δεύτερη έκδοση χρησιμοποιεί λιγότερη μνήμη λέει βλακείες. Αυτό διότι το ISO standard της C++ αναφέρει ρητά πως οι αναφορές (references) μπορούν να υλοποιηθούν από τον compiler όπως αυτός νομίζει. Επομένως στα χαρτιά κανείς δε μπορεί να πει τι ακριβώς θα επιστρέψει ο compiler πάνω στο stack στη δεύτερη έκδοση, ούτε φυσικά πόση μνήμη θα καταλαμβάνει αυτό (@smirnov: αυτό το τελευταίο σημαίνει ότι το τελευταίο μέρος της απάντησής σου δεν είναι technically correct). Στην πράξη και οι 2 εκδόσεις θα χρησιμοποιήσουν το ίδιο ποσό μνήμης. Αυτό διότι (εξαιρώντας inline functions) η τιμή επιστρέφεται πάντα μέσω του stack, και το stack καταχωρείται ένα memory page τη φορά. Δεδομένου ότι τυπική τιμή για μέγεθος page είναι 4K, στατιστικά ανα πάσα στιγμή το πρόγραμμα διαθέτει 2Κ μνήμης την οποία έχει καταλάβει αλλά δεν χρησιμοποιεί και η οποία είναι διαθέσιμη για το σκοπό αυτό. Επομένως το memory footprint του προγράμματος κατα συντριπτική πιθανότητα δεν πρόκειται να αλλάξει. Αν αλλάξει, δεν ξέρουμε ούτε καν αν η αλλαγή θα είναι προς το καλύτερο ή προς το χειρότερο (βλέπε παραπάνω). Η σημαντικότερη διαφορά των δύο εκδόσεων δεν έχει να κάνει με τη μνήμη! Το αν θα πάρεις μια παράμετρο ή θα επιστρέψεις μια τιμή by value ή by reference εξαρτάται από διάφορους παράγοντες, ο σημαντικότερος εκ των οποίων είναι τα semantics της function (ο τρόπος δηλαδή με τον οποίο υπόσχεται πως θα συμπεριφερθεί όταν την καλέσεις). Στη συντριπτική πλειοψηφία των περιπτώσεων αυτός είναι και ο μόνος παράγοντας που πρέπει να ληφθεί υπόψη. Το να μιλάμε αντ' αυτού για ντεμεκ λιγότερη χρήση μνήμης είναι εγκληματικά παραπλανητικό.
V.I.Smirnov Δημοσ. 17 Μαΐου 2012 Δημοσ. 17 Μαΐου 2012 Το παιδί είναι προφανώς αρχάριος και αναμένει μιαν απλή εξήγηση γι' αυτό που είδε, έστω όχι αυστηρά σωστή. Γι' αυτό γράφω "Με λίγα λόγια". Επιπλέον, προφανώς δεν γνωρίζει καλά τις θεμελιώδεις διαφορές κλήσης με αναφορά και με τιμή. Αυτό που έγραψα ότι πρέπει θεμελιωδώς να θυμάται κάποιος. Το ύφος και η έκταση μιας απάντησης πρέπει να είναι προσαρμοσμένα στη γνωστική στάθμη αυτού που ρωτάει, κι όχι τεχνική ανάλυση που μπορεί να τον μπερδέψει περισσότερο. Γι' αυτό και τα περισσότερο βιβλία εισαγωγής στην C++ δίνουν εξήγηση στο ερώτημα αυτό όμοια με με την απάντηση που έδωσα. Τέλος, τα περί "βλακείες" που γράφεις υποδηλώνουν υποτιμητικό ύφος στους συνομιλητές και δείχνουν ότι η ευγένεια δεν είναι το δυνατό σου σημείο... -
bokarinho Δημοσ. 18 Μαΐου 2012 Δημοσ. 18 Μαΐου 2012 Με λίγα λόγια : Αμφότερες οι double test(int,int) και double& test(int,int) δέχονται τα ορίσματα με τιμή. Άρα δημιουργούν αντίγραφα των δύο int κατά την κλήση τους. Η πρώτη επιστρέφει ένα int με τιμή, οπότε κατά την επιστροφή της δημιουργεί ένα "αντικείμενο" τύπου int. Η δεύτερη επιστρέφει ένα int με αναφορά, δηλ. το αντικείμενο int που έχει δημιουργήσει εσωτερικά. Αρα κατά την επιστροφή της δεν δημιουργεί κάτι επιπλέον και δεν καταναλώνει και επιπλέον μνήμη γι αυτό. Αυτό όμως είναι ασφαλές μόνον αν το αντικείμενο που επιστρέφεται έχει "διάρκεια ζωής" και έξω από την συνάρτηση. - VI, συμφωνώ εν μέρη, αρχικά επιστρέφουν και οι δύο double item όχι int αλλά σίγουρα αυτό σου ξέφυγε. Τώρα αυτό που καταφέρνει το reference είναι να το πω χοντρικά να παντρέψει μία διεύθυνση με μία μεταβλητή σαν να είναι το ίδιο, στην ουσία οι αναφορά είναι η ίδια η μεταβλητή. Στο τρόπο που το αναφέρεις double test(int,int) και double& test(int,int) ουσιαστικά είναι άχρηστες οι αναφορές. Στο παράδειγμα του φίλου όμως που περνάει σαν παράμετρο ένα πίνακα τότε ναι έχει σημασία να επιστρέψεις αναφορά καθώς δημιουργείς ένα άμεσο δεσμό με το κομμάτι του πίνακα και όχι απλά με την τιμή του. Γενικά τείνω να συμφωνήσω μαζί σου, με κάλυψε η άποψη σου η οποία πρακτικά είναι όσα χρειάζεται να γνωρίζει κάποιος για το συγκεκριμένο θέμα.
defacer Δημοσ. 18 Μαΐου 2012 Δημοσ. 18 Μαΐου 2012 Το παιδί είναι προφανώς αρχάριος και αναμένει μιαν απλή εξήγηση γι' αυτό που είδε, έστω όχι αυστηρά σωστή. Γι' αυτό γράφω "Με λίγα λόγια". Επιπλέον, προφανώς δεν γνωρίζει καλά τις θεμελιώδεις διαφορές κλήσης με αναφορά και με τιμή. Αυτό που έγραψα ότι πρέπει θεμελιωδώς να θυμάται κάποιος. Το ύφος και η έκταση μιας απάντησης πρέπει να είναι προσαρμοσμένα στη γνωστική στάθμη αυτού που ρωτάει, κι όχι τεχνική ανάλυση που μπορεί να τον μπερδέψει περισσότερο. Γι' αυτό και τα περισσότερο βιβλία εισαγωγής στην C++ δίνουν εξήγηση στο ερώτημα αυτό όμοια με με την απάντηση που έδωσα. Όλα αυτά που λες καλά και σε γενικές γραμμές συμφωνώ μαζί σου. Παρόλα αυτά σε κείνο το σημείο η απάντησή σου προσπαθεί να δικαιολογήσει τις "βλακείες" (βλέπε παρακάτω σχετικά με τη χρήση του επιθέτου) που διάβασε ο OP σε ό,τι είναι που μελετάει. Ξεκινώντας λοιπόν από τέτοια κακή βάση δεν είναι δυνατόν το σχετικό τμήμα της απάντησης -- ούτε δικής σου ούτε κανενός άλλου -- να είναι "καλό". Σκοπός μου λοιπόν ήταν να επιστήσω την προσοχή στο ότι η απάντηση σε κείνο το σημείο συνεχίζει την παραπληροφόρηση που ξεκίνησε η ερώτηση, απλά και κατανοητά. Δεν έχει καθόλου να κάνει με σένα προσωπικά, πράγμα που νομίζω ότι δεν έγινε αντιληπτό. Τέλος, τα περί "βλακείες" που γράφεις υποδηλώνουν υποτιμητικό ύφος στους συνομιλητές και δείχνουν ότι η ευγένεια δεν είναι το δυνατό σου σημείο... Να ξεκαθαρίσω ότι το βλακείες δεν πήγαινε σε κανέναν από αυτούς που συμμετέχουν στο thread, αλλά σ' αυτόν που είπε στον OP κάτι όχι απλά ανακριβές (δε θα έμπαινα στον κόπο να απαντήσω πιθανόν) αλλά πολύ χειρότερα παραπλανητικό. Νομίζω λοιπόν πως η παρεξήγηση αν υπήρξε λύθηκε και ας το αφήσουμε εδώ. Απο κει και πέρα δε νομίζω πως έχεις τα δεδομένα που θα σου επιτρέψουν να κρίνεις αν η ευγένεια είναι δυνατό μου σημείο (που τυχαίνει να είναι, όσο περίεργο κι αν σου φαίνεται). Είμαι σίγουρος πως μπορείς να καταλάβεις μόνος σου ότι το πως γράφει κάποιος (και πως μεταφράζονται τα γραφόμενά του) σε ένα text-only ασύγχρονο μέσο επικοινωνίας το οποίο έχει και τις ιδιαιτερότητες του insomnia δεν είναι τόσο καλή ένδειξη για το πώς επικοινωνεί πρόσωπο με πρόσωπο.
bokarinho Δημοσ. 18 Μαΐου 2012 Δημοσ. 18 Μαΐου 2012 ...Άρα κατά την επιστροφή της δεν δημιουργεί κάτι επιπλέον και δεν καταναλώνει και επιπλέον μνήμη γι αυτό....- ..Όποιος πει ότι μπορεί να εγγηθεί ότι η δεύτερη έκδοση χρησιμοποιεί λιγότερη μνήμη λέει βλακείες. Χωρίς να το παίξω δικηγόρος του διαβόλου, με βάση το πρώτο και το δεύτερο => ότι ο VI λέει βλακείες. Γενικά defacer χωρίς να έχω κάτι μαζί σου και χωρίς να σε ξέρω έξω από αυτό το text based forum as you said γενικά δεν μου φαίνεται ότι η ευγένεια σου είναι από τα προσόντα που θα μπορούσε κάποιος εύκολα να δει. Γενικά δεν μπαίνω στην διαδικασία να φέρω θέματα και post σου στην επιφάνεια, απλά κάθε φορά που γράφεις ανεξάρτητα αν είναι σωστά ή όχι αυτά που γράφεις, νιώθω ότι την λες και όχι τόσο ευγενικά. Απλά να σου θυμίσω, το ότι μπορεί (χωρίς αυτό να είναι διαπιστωμένο) να γνωρίζεις κάποια πράγματα παραπάνω από κάποιον, αυτό δεν καθιστά τον άλλον ηλίθιο ή χαζό ή βλάκα ή οτιδήποτε, ακόμα και αν είναι λάθος στην άποψη του. Προσωπικά δεν έχω τίποτα μαζί σου και δεν διαφωνώ για τις γνώσεις που έχεις, άλλωστε φαίνεται ότι γνωρίζεις πολλά πράγματα. Απλά το γεγονός και μόνο ότι ο συνομιλητής σου θεώρησε ότι τον κατηγορείς ότι λέει βλακείες κάτι που παρατήρησα και εγώ, ακόμα και αν δεν το εννοούσες υποδηλώνει ίσως κάποιο ενδότερο πρόβλημα επικοινωνίας ή κάποια άλλη δυσλειτουργία στην διασύνδεση συναισθημάτων και γραπτού λόγου.
defacer Δημοσ. 19 Μαΐου 2012 Δημοσ. 19 Μαΐου 2012 @bokarinho: Σ' ευχαριστώ για τον κόπο που έκανες να γράψεις μια αντικειμενική και ακριβή ανάλυση του πράγματος. Επειδή δεν έχει σχέση με το topic, μερικά σχόλια που έχω επι τούτου σε spoiler: Χωρίς να το παίξω δικηγόρος του διαβόλου, με βάση το πρώτο και το δεύτερο => ότι ο VI λέει βλακείες. Ναι, μπορεί να βγει αυτό το συμπέρασμα, αλλά το ξεκαθαρίσαμε ελπίζω πως δεν ήταν αυτός ο σκοπός μου. Λάθος επιλογή λέξεων, in my defense ίσως επειδή όταν ακούω πράγματα τόσο λάθος όσο "οι αναφορές καταναλώνουν λιγότερη μνήμη" αφρίζω λίγο. Όχι επειδή κάποιος δεν ξέρει, αλλά επειδή διαδίδει επικίνδυνες ανακρίβειες. Και πάλι, αυτός ο κάποιος εδώ δεν ήταν ο Smirnov. Γενικά defacer χωρίς να έχω κάτι μαζί σου και χωρίς να σε ξέρω έξω από αυτό το text based forum as you said γενικά δεν μου φαίνεται ότι η ευγένεια σου είναι από τα προσόντα που θα μπορούσε κάποιος εύκολα να δει. Γενικά δεν μπαίνω στην διαδικασία να φέρω θέματα και post σου στην επιφάνεια, απλά κάθε φορά που γράφεις ανεξάρτητα αν είναι σωστά ή όχι αυτά που γράφεις, νιώθω ότι την λες και όχι τόσο ευγενικά. Υπάρχουν κάποια πράγματα που για μένα είναι κόκκινο πανί και αν αποφασίσω να απαντήσω θα την πω. Κάποια highlights είναι π.χ. όταν κάποιος κάνει ερωτήσεις που δείχνουν ότι δε μπήκε στον κόπο ούτε ένα google να ρίξει, ή όταν γράφει "έχω πρόβλημα" και δίνει μηδέν πληροφορίες (εκεί νομίζω μέχρι και παιδάκι θα καταλάβαινε πως αν δεν πεις το πρόβλημα στους γονείς δε θα μπορέσουν να σε βοηθήσουν). Θα έβρισκες αρκετά παραδείγματα αν έψαχνες. Απλά να σου θυμίσω, το ότι μπορεί (χωρίς αυτό να είναι διαπιστωμένο) να γνωρίζεις κάποια πράγματα παραπάνω από κάποιον, αυτό δεν καθιστά τον άλλον ηλίθιο ή χαζό ή βλάκα ή οτιδήποτε, ακόμα και αν είναι λάθος στην άποψη του. Συμφωνώ 110% με αυτό. Σε καμία περίπτωση δεν καταλογίζω σε κάποιον την έλλειψη τεχνικών γνώσεων σαν αμάρτημα. Καταλογίζω όμως (χωρίς αυτό να έχει σχέση με το συγκεκριμένο θέμα) όπως είπα παραπάνω την έλλειψη στοιχειώδους σκέψης αλλά και τη διανοητική οκνηρία (μεγάλο θέμα αλλά αν θέλεις δες λίγο www.whathaveyoutried.com που είναι σχετικό και good reading κατά την άποψή μου). Προσωπικά δεν έχω τίποτα μαζί σου και δεν διαφωνώ για τις γνώσεις που έχεις, άλλωστε φαίνεται ότι γνωρίζεις πολλά πράγματα. Απλά το γεγονός και μόνο ότι ο συνομιλητής σου θεώρησε ότι τον κατηγορείς ότι λέει βλακείες κάτι που παρατήρησα και εγώ, ακόμα και αν δεν το εννοούσες υποδηλώνει ίσως κάποιο ενδότερο πρόβλημα επικοινωνίας ή κάποια άλλη δυσλειτουργία στην διασύνδεση συναισθημάτων και γραπτού λόγου. Στην προκειμένη υποδηλώνει ότι λόγω κόκκινου πανιού και βιασύνης δεν κάθησα να διαβάσω ξανά προσεκτικά το post, με αποτέλεσμα να φανεί δικαιολογημένα πως τη λέω άσχημα στο συμφορουμίτη μας. Δεν ήταν η πρόθεσή μου και πρόκειται για συμπεριφορά που γενικά και γω ο ίδιος αποδοκιμάζω. Και πάλι ευχαριστώ για το χρόνο σου.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα