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

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
Master_ex
Mbyte level
Mbyte level
Posts: 991
Joined: Tue Nov 06, 2007 11:11 pm
Academic status: N>4
Gender:

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

Post by Master_ex » Tue Feb 05, 2008 3:34 pm

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

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

Post by fo@ » Tue Feb 05, 2008 4:43 pm

Κάθε θέση είναι ένα byte
a) Δε το ξέρει. Απλά διαβάζει και τις υπόλοιπες τρεις θέσεις έστω και αν έχουν δεσμευτεί για άλλες μεταβλητές
b) Το καλούπωμα σε δείκτες δεν αλλάζει τίποτα στη μνήμη. Π.χ. από (char *) σε (int *). Απλά σου παρέχει ένα εναλλακτικό τρόπο να δεις μια θέση μνήμης. Π.χ ενώ με (char *) κοίταγες σε μια θέση, με int * κοιτάς τέσσερεις συνεχόμενες και τις ερμηνεύεις ως μια ακέραια τιμή. Οταν δεν κάνεις καλούπωμα σε δείκτη, τότε απλά ένα αντίγραφο της πηγαίας μεταβλητής μετατρέπεται με κατάλληλο τρόπο στον άλλο τύπο και αποθηκεύεται αναλόγως κάπου αλλού .
"With soap, baptism is a good thing"
User avatar
Master_ex
Mbyte level
Mbyte level
Posts: 991
Joined: Tue Nov 06, 2007 11:11 pm
Academic status: N>4
Gender:

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

Post by Master_ex » Tue Feb 05, 2008 5:17 pm

ΟΚ για το α), για το β) δεν είμαι σίγουρος ότι κατάλαβα.
Αν είναι:

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) και από το σημείο και μετά που κάνουμε το καλούπωμα θα αναφερόμαστε σε αυτές τις θέσεις μνήμης?
http://foss.aueb.gr the penguin strikes back <(' ) | channel #foss-aueb @ irc.freenode.net
Image Play and help!
User avatar
fo@
Kilobyte level
Kilobyte level
Posts: 337
Joined: Mon Jun 19, 2006 12:35 pm

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

Post by fo@ » Tue Feb 05, 2008 5:27 pm

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.
"With soap, baptism is a good thing"
User avatar
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: Τύποι αντικειμένων και διαχείρηση τους από τη μνήμη

Post by netharis » Tue Feb 05, 2008 5:34 pm

Νομίζω οτι ο Master_ex αναφέρεται στη Java και όχι στη C/C++ οπου υπάρχουν οι operators *, &.
Image
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."
User avatar
Master_ex
Mbyte level
Mbyte level
Posts: 991
Joined: Tue Nov 06, 2007 11:11 pm
Academic status: N>4
Gender:

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

Post by Master_ex » Tue Feb 05, 2008 5:37 pm

Ναι στη 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)?
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
Image Play and help!
User avatar
fo@
Kilobyte level
Kilobyte level
Posts: 337
Joined: Mon Jun 19, 2006 12:35 pm

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

Post by fo@ » Tue Feb 05, 2008 5:48 pm

Στη java δεν έχεις ουσιαστικά καμία πληροφορία για το που αποθηκεύονται στη μνήμη οι μεταβλητές. Η καθε μία παίρνει το δικό της χώρο και δεν υπάρχει δυνατότητα επικάλυψης της μίας από την άλλη. Σε ένα καλούπωμα απλά γίνεται γράψιμο στο χώρο μνήμης της μεταβλητής προορισμού.
"With soap, baptism is a good thing"
*estrngd
Mbyte level
Mbyte level
Posts: 612
Joined: Thu Dec 16, 2004 1:45 pm
Academic status: N>4
Gender:
Contact:

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

Post by *estrngd » Tue Feb 05, 2008 8:56 pm

το μηχάνημα δεν ασχολείται με το τι γίνεται στην μνήμη νομίζω, δηλαδή πόσες θέσεις θα πιάσει η μεταβλητή ως ο τάδε τύπος, αυτό το κάνει η γλώσσα. Αυτή ερμηνεύει την κατάσταση της μνήμης κατά το δοκούν.
Μaster_ex wrote:Με τι θα ισούται η z μετά από αυτό(το εύρος τιμών του byte είναι -128 ως 127)?
κι αν το έτρεχες;
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

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

Post by HdkiLLeR » Tue Feb 05, 2008 9:56 pm

Αν και ο 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
Post Reply

Return to “Προγραμματισμός”