Page 1 of 1

Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη

Posted: Tue Feb 05, 2008 3:34 pm
by Master_ex
Να ρωτήσω κάτι πιο πολύ εγκυκλοπαιδικά.
Λοιπόν απ'ότι έχω καταλάβει κάθε θέση στη μνήμη είναι 1byte ή τουλάχιστον έτσι το θεωρούμε(σύμφωνα με το βιβλίο του κ.Κάβουρα).
α)Άν χρηιμοποιήσουμε integer που είναι 3bytes θα χρειαστούν τρία κελιά που θα είναι διαδοχικά στη μνήμη αλλά πως θα ξέρει "ο υπολογιστής" πως έχουν δεσμευτεί τρείς θέσεις. Λειτουργεί σαν τους πίνακες δηάδή στη 1η θέση υπάρχει ο αριθμός θέσεων του πίνακα, έτσι και στη μνήμη μία μεταβλητή Χ τύπου int θα πιάνει τελικά 4 θέσεις(4bytes)στη μνήμη???
β)Επίσης όταν καλουπώσουμε μία μεταβλητή ουσιαστικά αλλάζει ο τύπος της από την αρχή??? Αν είναι έτσι και σε ένα πρόγραμμα καλουπώσω μία μεταβλητή στο τέλος ενώ νωρίτερα την έχω χρησιμοποιήσει πάλι από την αρχή θα είναι άλλου τύπου από αυτόν που την έχω δηλώσει αρχικά και θα πιάνει συγκεκριμένες θέσεις μνήμης. Διαφορετικά τι συμβαίνει όταν καλουπώνουμε στη μνήμη? Από το σημείο που έχουμε κάνει το καλούπωμα και μετά αναφερόμαστε σε άλλες θέσεις μνήμης?

Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη

Posted: Tue Feb 05, 2008 4:43 pm
by fo@
Κάθε θέση είναι ένα byte
a) Δε το ξέρει. Απλά διαβάζει και τις υπόλοιπες τρεις θέσεις έστω και αν έχουν δεσμευτεί για άλλες μεταβλητές
b) Το καλούπωμα σε δείκτες δεν αλλάζει τίποτα στη μνήμη. Π.χ. από (char *) σε (int *). Απλά σου παρέχει ένα εναλλακτικό τρόπο να δεις μια θέση μνήμης. Π.χ ενώ με (char *) κοίταγες σε μια θέση, με int * κοιτάς τέσσερεις συνεχόμενες και τις ερμηνεύεις ως μια ακέραια τιμή. Οταν δεν κάνεις καλούπωμα σε δείκτη, τότε απλά ένα αντίγραφο της πηγαίας μεταβλητής μετατρέπεται με κατάλληλο τρόπο στον άλλο τύπο και αποθηκεύεται αναλόγως κάπου αλλού .

Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη

Posted: Tue Feb 05, 2008 5:17 pm
by Master_ex
ΟΚ για το α), για το β) δεν είμαι σίγουρος ότι κατάλαβα.
Αν είναι:

Code: Select all

int x = 5;
x = 6;
long y = 7;
x = (long) y;
Έστω ότι το x καταλαμβάνει τις θέσεις μνήμης 100,101,102,103 αφού ως integer θέλει 4bytes. Κάθε φορά που του αλλάζουμε τιμή αλλάζει το περιεχόμενο αυτών των θέσεων μνήμης. Όταν κάνουμε όμως καλούπωμα για να του εκχωρήσουμε την long μεταβλητή τότε τι κάνει? Πηγαίνει σε νέες ελεύθερες θέσεις μνήμης και τις καταλαμβάνει.Εδώ δηλαδή θα πάει στις 110,111,112,113,114,115,116,117(8bytes) και από το σημείο και μετά που κάνουμε το καλούπωμα θα αναφερόμαστε σε αυτές τις θέσεις μνήμης?

Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη

Posted: Tue Feb 05, 2008 5:27 pm
by fo@
Master_ex wrote:ΟΚ για το α), για το β) δεν είμαι σίγουρος ότι κατάλαβα.
Αν είναι:

Code: Select all

int x = 5;
x = 6;
long y = 7;
x = (long) y;
Εννοείς μάλλον

Code: Select all

y = (long)x
Master_ex wrote: Έστω ότι το x καταλαμβάνει τις θέσεις μνήμης 100,101,102,103 αφού ως integer θέλει 4bytes. Κάθε φορά που του αλλάζουμε τιμή αλλάζει το περιεχόμενο αυτών των θέσεων μνήμης.
Ακριβώς
Master_ex wrote: Όταν κάνουμε όμως καλούπωμα για να του εκχωρήσουμε την long μεταβλητή τότε τι κάνει? Πηγαίνει σε νέες ελεύθερες θέσεις μνήμης και τις καταλαμβάνει.Εδώ δηλαδή θα πάει στις 110,111,112,113,114,115,116,117(8bytes) και από το σημείο και μετά που κάνουμε το καλούπωμα θα αναφερόμαστε σε αυτές τις θέσεις μνήμης?
Ακριβώς

Ενώ αν

Code: Select all

int x = 5;
int *px = &x;
x = 6;
long y = 7;
long *py = &y;
py = (long *) px;
τότε έστω και αν η py δείχνει σε μια δεσμευμένη θέση ακεραίου ωστόσο με *py θα αναφέρεσαι στην τιμή των θέσεων
100, 101, 102, 103, 104, 105, 106, 107.

Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη

Posted: Tue Feb 05, 2008 5:34 pm
by netharis
Νομίζω οτι ο Master_ex αναφέρεται στη Java και όχι στη C/C++ οπου υπάρχουν οι operators *, &.

Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη

Posted: Tue Feb 05, 2008 5:37 pm
by Master_ex
Ναι στη java αναφέρομαι.
---------------------------------------------
Όκ κατάλαβα τι σκεφτόμουν λάθος, το καλούπωμα γίνεται για να εκχωρίσουμε τύπους μεγαλύτερους σε κάποιον μικρότερο. Έτσι λοιπών "φέρνουμε το αποτέλεσμα στα μέτρα μας". Αυτή η μετατροπή λογικά θα γίνεται άμεσα(φαντάζομαι)//όπως και οι final μεταβλητές αντικαθαστούνται την ώρα της μεταγλώτησης από τις τιμές που αντιπροσωπεύουν.
Εγώ ήθελα να μεγαλώσω την αρχική μεταβλητή και όχι να μικρύνω αυτό που θα της εκχωρήσω.
Οπότε μου μένει η απλή απορία :smt016 :

Code: Select all

byte z,x,c;
z=127;
x=127;
c=127;
z = (byte) (x+c);
Η z θα καταλαμβάνει από την αρχή μέχρι το τέλος συγκεκριμένες θέσεις μνήμης π.χ.0,1,2,3
Με τι θα ισούται η z μετά από αυτό(το εύρος τιμών του byte είναι -128 ως 127)?

Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη

Posted: Tue Feb 05, 2008 5:48 pm
by fo@
Στη java δεν έχεις ουσιαστικά καμία πληροφορία για το που αποθηκεύονται στη μνήμη οι μεταβλητές. Η καθε μία παίρνει το δικό της χώρο και δεν υπάρχει δυνατότητα επικάλυψης της μίας από την άλλη. Σε ένα καλούπωμα απλά γίνεται γράψιμο στο χώρο μνήμης της μεταβλητής προορισμού.

Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη

Posted: Tue Feb 05, 2008 8:56 pm
by *estrngd
το μηχάνημα δεν ασχολείται με το τι γίνεται στην μνήμη νομίζω, δηλαδή πόσες θέσεις θα πιάσει η μεταβλητή ως ο τάδε τύπος, αυτό το κάνει η γλώσσα. Αυτή ερμηνεύει την κατάσταση της μνήμης κατά το δοκούν.
Μaster_ex wrote:Με τι θα ισούται η z μετά από αυτό(το εύρος τιμών του byte είναι -128 ως 127)?
κι αν το έτρεχες;

Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη

Posted: Tue Feb 05, 2008 9:56 pm
by HdkiLLeR
Αν και ο fo@ το κάλυψε το θέμα παραπάνω, στην Java το type casting ελέγχεται. Οπότε δεν μπορείς να ξεφύγεις και να οδηγηθείς σε overflow ή να προσπελάσεις τιμές άλλης μεταβλητής με αυτόν τον τρόπο. Σε κάθε περίπτωση casting στην Java γίνεται κατάλληλη μετατροπή με έλεγχο προσίμων και εάν αυτό δεν μπορεί να γίνει για κάποιο λόγο (πχ κάνεις άκυρο cast) τότε θα πάρεις το κατάλληλο μύνημα λάθους. Όλα αυτά βέβαια σε μια υποθετική γλώσσα που λέγεται Java :)