DarthMoul
02-08-2004, 13:14
Για κοιτάξτε λιγάκι την παρακάτω δήλωση:
int i, *ip;
Οι μεταβλητές τύπου int έχουν μέγεθος 4 bytes. Όλοι οι pointers ανεξαρτήτως τύπου 4 bytes. Όλα μια χαρούλα. Κανένα misalignment.
Ας δούμε όμως λιγάκι το manual του compiler. Είναι το manual του gcc αλλά το ίδιο ισχύει και για τον msc και για τον icc:
-m64
Generate code for a 32-bit or 64-bit environment. The
32-bit environment sets int, long and pointer to 32
bits and generates code that runs on any i386 system.
The 64-bit environment sets int to 32 bits and long
and pointer to 64 bits and generates code for AMD's
x86-64 architecture.
Όταν θα χρειαστεί να κάνουμε compilation για x86-64 αρχιτεκτονική, την πατήσαμε. Η μεταβλητή i έχει μέγεθος 4 bytes, αλλά ο pointer 8 bytes. Θα εισπράξουμε ένα πολύ όμορφο misalignment. Για να αποφύγουμε την παγίδα, θα πρέπει όλοι οι pointers ανεξαρτήτως τύπου, να δηλωθούν πριν από τους long. Αυτό θα μαs καλύψει ακόμα και στην περίπτωση που ο κώδικας μας τρέξει σε 128bits πλατφόρμα. Μην γελάτε. Υπάρχουν από χρόνια 128 bits CPUs. Πάμε να δούμε ένα παράδειγμα δηλώσεων ώστε να μην ταλαιπωρηθούμε από την έλευση των 64 bits.
long double ld;
double d;
char *cp;
int *ip ;
long *lp ;
double *dp;
long l;
int i ;
char c ;
int i, *ip;
Οι μεταβλητές τύπου int έχουν μέγεθος 4 bytes. Όλοι οι pointers ανεξαρτήτως τύπου 4 bytes. Όλα μια χαρούλα. Κανένα misalignment.
Ας δούμε όμως λιγάκι το manual του compiler. Είναι το manual του gcc αλλά το ίδιο ισχύει και για τον msc και για τον icc:
-m64
Generate code for a 32-bit or 64-bit environment. The
32-bit environment sets int, long and pointer to 32
bits and generates code that runs on any i386 system.
The 64-bit environment sets int to 32 bits and long
and pointer to 64 bits and generates code for AMD's
x86-64 architecture.
Όταν θα χρειαστεί να κάνουμε compilation για x86-64 αρχιτεκτονική, την πατήσαμε. Η μεταβλητή i έχει μέγεθος 4 bytes, αλλά ο pointer 8 bytes. Θα εισπράξουμε ένα πολύ όμορφο misalignment. Για να αποφύγουμε την παγίδα, θα πρέπει όλοι οι pointers ανεξαρτήτως τύπου, να δηλωθούν πριν από τους long. Αυτό θα μαs καλύψει ακόμα και στην περίπτωση που ο κώδικας μας τρέξει σε 128bits πλατφόρμα. Μην γελάτε. Υπάρχουν από χρόνια 128 bits CPUs. Πάμε να δούμε ένα παράδειγμα δηλώσεων ώστε να μην ταλαιπωρηθούμε από την έλευση των 64 bits.
long double ld;
double d;
char *cp;
int *ip ;
long *lp ;
double *dp;
long l;
int i ;
char c ;