Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη
Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη
Να ρωτήσω κάτι πιο πολύ εγκυκλοπαιδικά.
Λοιπόν απ'ότι έχω καταλάβει κάθε θέση στη μνήμη είναι 1byte ή τουλάχιστον έτσι το θεωρούμε(σύμφωνα με το βιβλίο του κ.Κάβουρα).
α)Άν χρηιμοποιήσουμε integer που είναι 3bytes θα χρειαστούν τρία κελιά που θα είναι διαδοχικά στη μνήμη αλλά πως θα ξέρει "ο υπολογιστής" πως έχουν δεσμευτεί τρείς θέσεις. Λειτουργεί σαν τους πίνακες δηάδή στη 1η θέση υπάρχει ο αριθμός θέσεων του πίνακα, έτσι και στη μνήμη μία μεταβλητή Χ τύπου int θα πιάνει τελικά 4 θέσεις(4bytes)στη μνήμη???
β)Επίσης όταν καλουπώσουμε μία μεταβλητή ουσιαστικά αλλάζει ο τύπος της από την αρχή??? Αν είναι έτσι και σε ένα πρόγραμμα καλουπώσω μία μεταβλητή στο τέλος ενώ νωρίτερα την έχω χρησιμοποιήσει πάλι από την αρχή θα είναι άλλου τύπου από αυτόν που την έχω δηλώσει αρχικά και θα πιάνει συγκεκριμένες θέσεις μνήμης. Διαφορετικά τι συμβαίνει όταν καλουπώνουμε στη μνήμη? Από το σημείο που έχουμε κάνει το καλούπωμα και μετά αναφερόμαστε σε άλλες θέσεις μνήμης?
Λοιπόν απ'ότι έχω καταλάβει κάθε θέση στη μνήμη είναι 1byte ή τουλάχιστον έτσι το θεωρούμε(σύμφωνα με το βιβλίο του κ.Κάβουρα).
α)Άν χρηιμοποιήσουμε integer που είναι 3bytes θα χρειαστούν τρία κελιά που θα είναι διαδοχικά στη μνήμη αλλά πως θα ξέρει "ο υπολογιστής" πως έχουν δεσμευτεί τρείς θέσεις. Λειτουργεί σαν τους πίνακες δηάδή στη 1η θέση υπάρχει ο αριθμός θέσεων του πίνακα, έτσι και στη μνήμη μία μεταβλητή Χ τύπου int θα πιάνει τελικά 4 θέσεις(4bytes)στη μνήμη???
β)Επίσης όταν καλουπώσουμε μία μεταβλητή ουσιαστικά αλλάζει ο τύπος της από την αρχή??? Αν είναι έτσι και σε ένα πρόγραμμα καλουπώσω μία μεταβλητή στο τέλος ενώ νωρίτερα την έχω χρησιμοποιήσει πάλι από την αρχή θα είναι άλλου τύπου από αυτόν που την έχω δηλώσει αρχικά και θα πιάνει συγκεκριμένες θέσεις μνήμης. Διαφορετικά τι συμβαίνει όταν καλουπώνουμε στη μνήμη? Από το σημείο που έχουμε κάνει το καλούπωμα και μετά αναφερόμαστε σε άλλες θέσεις μνήμης?
http://foss.aueb.gr the penguin strikes back <(' ) | channel #foss-aueb @ irc.freenode.net
Play and help!

Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη
Κάθε θέση είναι ένα byte
a) Δε το ξέρει. Απλά διαβάζει και τις υπόλοιπες τρεις θέσεις έστω και αν έχουν δεσμευτεί για άλλες μεταβλητές
b) Το καλούπωμα σε δείκτες δεν αλλάζει τίποτα στη μνήμη. Π.χ. από (char *) σε (int *). Απλά σου παρέχει ένα εναλλακτικό τρόπο να δεις μια θέση μνήμης. Π.χ ενώ με (char *) κοίταγες σε μια θέση, με int * κοιτάς τέσσερεις συνεχόμενες και τις ερμηνεύεις ως μια ακέραια τιμή. Οταν δεν κάνεις καλούπωμα σε δείκτη, τότε απλά ένα αντίγραφο της πηγαίας μεταβλητής μετατρέπεται με κατάλληλο τρόπο στον άλλο τύπο και αποθηκεύεται αναλόγως κάπου αλλού .
a) Δε το ξέρει. Απλά διαβάζει και τις υπόλοιπες τρεις θέσεις έστω και αν έχουν δεσμευτεί για άλλες μεταβλητές
b) Το καλούπωμα σε δείκτες δεν αλλάζει τίποτα στη μνήμη. Π.χ. από (char *) σε (int *). Απλά σου παρέχει ένα εναλλακτικό τρόπο να δεις μια θέση μνήμης. Π.χ ενώ με (char *) κοίταγες σε μια θέση, με int * κοιτάς τέσσερεις συνεχόμενες και τις ερμηνεύεις ως μια ακέραια τιμή. Οταν δεν κάνεις καλούπωμα σε δείκτη, τότε απλά ένα αντίγραφο της πηγαίας μεταβλητής μετατρέπεται με κατάλληλο τρόπο στον άλλο τύπο και αποθηκεύεται αναλόγως κάπου αλλού .
"With soap, baptism is a good thing"
Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη
ΟΚ για το α), για το β) δεν είμαι σίγουρος ότι κατάλαβα.
Αν είναι:
Έστω ότι το x καταλαμβάνει τις θέσεις μνήμης 100,101,102,103 αφού ως integer θέλει 4bytes. Κάθε φορά που του αλλάζουμε τιμή αλλάζει το περιεχόμενο αυτών των θέσεων μνήμης. Όταν κάνουμε όμως καλούπωμα για να του εκχωρήσουμε την long μεταβλητή τότε τι κάνει? Πηγαίνει σε νέες ελεύθερες θέσεις μνήμης και τις καταλαμβάνει.Εδώ δηλαδή θα πάει στις 110,111,112,113,114,115,116,117(8bytes) και από το σημείο και μετά που κάνουμε το καλούπωμα θα αναφερόμαστε σε αυτές τις θέσεις μνήμης?
Αν είναι:
Code: Select all
int x = 5;
x = 6;
long y = 7;
x = (long) y;
http://foss.aueb.gr the penguin strikes back <(' ) | channel #foss-aueb @ irc.freenode.net
Play and help!

Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη
Εννοείς μάλλον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;
100, 101, 102, 103, 104, 105, 106, 107.
"With soap, baptism is a good thing"
- netharis
- Venus Former Team Member
- Posts: 1845
- Joined: Sun Jul 15, 2007 2:37 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Seattle, Washington
- Contact:
Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη
Νομίζω οτι ο Master_ex αναφέρεται στη Java και όχι στη C/C++ οπου υπάρχουν οι operators *, &.

Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη
Ναι στη java αναφέρομαι.
---------------------------------------------
Όκ κατάλαβα τι σκεφτόμουν λάθος, το καλούπωμα γίνεται για να εκχωρίσουμε τύπους μεγαλύτερους σε κάποιον μικρότερο. Έτσι λοιπών "φέρνουμε το αποτέλεσμα στα μέτρα μας". Αυτή η μετατροπή λογικά θα γίνεται άμεσα(φαντάζομαι)//όπως και οι final μεταβλητές αντικαθαστούνται την ώρα της μεταγλώτησης από τις τιμές που αντιπροσωπεύουν.
Εγώ ήθελα να μεγαλώσω την αρχική μεταβλητή και όχι να μικρύνω αυτό που θα της εκχωρήσω.
Οπότε μου μένει η απλή απορία
:
Η z θα καταλαμβάνει από την αρχή μέχρι το τέλος συγκεκριμένες θέσεις μνήμης π.χ.0,1,2,3
Με τι θα ισούται η z μετά από αυτό(το εύρος τιμών του byte είναι -128 ως 127)?
---------------------------------------------
Όκ κατάλαβα τι σκεφτόμουν λάθος, το καλούπωμα γίνεται για να εκχωρίσουμε τύπους μεγαλύτερους σε κάποιον μικρότερο. Έτσι λοιπών "φέρνουμε το αποτέλεσμα στα μέτρα μας". Αυτή η μετατροπή λογικά θα γίνεται άμεσα(φαντάζομαι)//όπως και οι final μεταβλητές αντικαθαστούνται την ώρα της μεταγλώτησης από τις τιμές που αντιπροσωπεύουν.
Εγώ ήθελα να μεγαλώσω την αρχική μεταβλητή και όχι να μικρύνω αυτό που θα της εκχωρήσω.
Οπότε μου μένει η απλή απορία

Code: Select all
byte z,x,c;
z=127;
x=127;
c=127;
z = (byte) (x+c);
Με τι θα ισούται η z μετά από αυτό(το εύρος τιμών του byte είναι -128 ως 127)?
Last edited by Master_ex on Tue Feb 05, 2008 5:53 pm, edited 1 time in total.
http://foss.aueb.gr the penguin strikes back <(' ) | channel #foss-aueb @ irc.freenode.net
Play and help!

Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη
Στη java δεν έχεις ουσιαστικά καμία πληροφορία για το που αποθηκεύονται στη μνήμη οι μεταβλητές. Η καθε μία παίρνει το δικό της χώρο και δεν υπάρχει δυνατότητα επικάλυψης της μίας από την άλλη. Σε ένα καλούπωμα απλά γίνεται γράψιμο στο χώρο μνήμης της μεταβλητής προορισμού.
"With soap, baptism is a good thing"
-
- Mbyte level
- Posts: 612
- Joined: Thu Dec 16, 2004 1:45 pm
- Academic status: N>4
- Gender: ♂
- Contact:
Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη
το μηχάνημα δεν ασχολείται με το τι γίνεται στην μνήμη νομίζω, δηλαδή πόσες θέσεις θα πιάσει η μεταβλητή ως ο τάδε τύπος, αυτό το κάνει η γλώσσα. Αυτή ερμηνεύει την κατάσταση της μνήμης κατά το δοκούν.
κι αν το έτρεχες;Μaster_ex wrote:Με τι θα ισούται η z μετά από αυτό(το εύρος τιμών του byte είναι -128 ως 127)?
- HdkiLLeR
- Venus Project Founder
- Posts: 4356
- Joined: Tue Jan 27, 2004 4:41 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: New York, NY
- Contact:
Re: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη
Αν και ο fo@ το κάλυψε το θέμα παραπάνω, στην Java το type casting ελέγχεται. Οπότε δεν μπορείς να ξεφύγεις και να οδηγηθείς σε overflow ή να προσπελάσεις τιμές άλλης μεταβλητής με αυτόν τον τρόπο. Σε κάθε περίπτωση casting στην Java γίνεται κατάλληλη μετατροπή με έλεγχο προσίμων και εάν αυτό δεν μπορεί να γίνει για κάποιο λόγο (πχ κάνεις άκυρο cast) τότε θα πάρεις το κατάλληλο μύνημα λάθους. Όλα αυτά βέβαια σε μια υποθετική γλώσσα που λέγεται Java 

-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie