Προς το περιεχόμενο

Data structure alignment - C


dimitris21gr

Προτεινόμενες αναρτήσεις

Ούτε εγώ είμαι του image processing. Πρώτη φορά τυχαίνει να ασχοληθώ. Αν και ο σκοπός της εργασίας δεν είναι αυτός. Τον 2d array τον χρειάζομαι γιατί παίζω με την έννοια των γειτονικών pixels. Θα ρίξω μια ματιά σε αυτά που προτείνεις για να δω αν μπορώ να κερδίσω κάτι από αυτά.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 31
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

....

 

Sorry που σου το χαλάω αλλά δεν κατάλαβες καν την ερώτηση.

 

  • Σοβαρά? για διάβασε πάλι τι ρωτάει... ρωτάει αν το struct του με 3 χαρακτήρες θα έχει πάντα το ίδιο μέγεθος. Και του είπα ναι γιατί ο χαρακτήρας παντού και πάντα έχει 1 byte ο καθένας. Αν ήταν float θα μπορούσε να διαφέρει από ΛΣ/Αρχιτεκτονική. 
  • Οπότε πήρε την απάντηση αυτόματα... ναι θα έχει το ίδιο μέγεθος ανεξάρτητα σε ποιο ΛΣ/Αρχιτεκτονική είναι....

Στα πλαίσια της άσκησης που κάνω θέλω να φτιάξω ένα struct το οποίο να περιέχει 3 char μεταβλητές. Με δοκιμές που κάνω βλέπω πως όντως το μέγεθος του είναι 3 bytes. Βάση και του παραπάνω άρθρου μπορώ να βγάλω το ασφαλές συμπέρασμα ότι όπου και να τρέξω το πρόγραμμα μου το struct αυτό θα έχει 3 bytes μέγεθος;

 


Και 2ον, σε βλέπω ότι σε όλα τα Post απαντάς 'αρλούμπες'. Όλο απαντάς με κείμενα από Wikipedia, Βιβλία, Περιοδικά, Tuts Κλπ. Κάτι δικό σου μήπως? δεν θέλουμε επιστημονική απάντηση (όχι πως αυτά που απαντάς έχουν σχέση με επιστημονικές απαντήσεις. Τα περισσότερα είναι από τον κάθε 'wannabe επιστήμονα')

 

Πολύ φιλικά φίλε μ, γενικά βλέπω ότι ο χαρακτήρας σου είναι πολύ... πως να το πω... Snoob...? γενικά βλέπω ότι 'πουλας' εδώ μέσα...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Σοβαρά? για διάβασε πάλι τι ρωτάει... ρωτάει αν το struct του με 3 χαρακτήρες θα έχει πάντα το ίδιο μέγεθος. Και του είπα ναι γιατί ο χαρακτήρας παντού και πάντα έχει 1 byte ο καθένας. Αν ήταν float θα μπορούσε να διαφέρει από ΛΣ/Αρχιτεκτονική. 
  • Οπότε πήρε την απάντηση αυτόματα... ναι θα έχει το ίδιο μέγεθος ανεξάρτητα σε ποιο ΛΣ/Αρχιτεκτονική είναι....
Και όμως φιλαράκι εσύ είσαι αυτός που δεν κατάλαβες και πρέπει να το ξαναδιαβάσεις. Το γράφεις κιόλας και εσύ ότι ρωτάει για το struct. Ανεξάρτητα από το μέγεθος κάθε τύπου, σε ένα struct μπορεί να μπει padding ανάμεσα στα μέλη ώστε η προσπέλαση της Χ μεταβλητής να είναι ευθυγραμμισμένη και επίσης μπορεί να μπει padding και στο τέλος της struct ώστε να είναι ευθυγραμμισμένη ολόκληρη η δομή για το ενδεχόμενο να ορίσεις ένα πίνακα από αυτές τις δομές.

 

Ο OP λοιπόν θέλει να βεβαιωθεί ότι το μέγεθος της δομής θα είναι πάντα 3 όχι γιατί μπορεί να έχει διαφορετικό μέγεθος ο char σε κάποια αρχιτεκτονική αλλά γιατί μπορεί να έχει μπει padding.

 

Ο int έχει σχεδόν σε όλες τις 32bit και 64bit πλατφόρμες μέγεθος 4, παρόλα αυτά δοκίμασε να μπλέξεις μέσα σε μια δομή chars και ints και θα δεις ότι σε διαφορετικούς compilers θα έχεις διαφορετικό μέγεθος δομής. Ακόμη και στον ίδιο compiler θα έχεις διαφορετικό μέγεθος δομής ανάλογα με το πως θα διατάξεις τα μέλη της δομής. Όλα αυτά ενώ ο char και ο int έχουν σταθερό μέγεθος.

 

 

Και 2ον, σε βλέπω ότι σε όλα τα Post απαντάς 'αρλούμπες'. Όλο απαντάς με κείμενα από Wikipedia, Βιβλία, Περιοδικά, Tuts Κλπ. Κάτι δικό σου μήπως? δεν θέλουμε επιστημονική απάντηση (όχι πως αυτά που απαντάς έχουν σχέση με επιστημονικές απαντήσεις. Τα περισσότερα είναι από τον κάθε 'wannabe επιστήμονα')

Γιατί φυσικά το να πεις κάτι "δικό σου" που έβγαλες από το στομάχι σου έχει μεγαλύτερη αξία από το να αναφέρεις τι λέει το authoritative κείμενο που διέπει τις υλοποιήσεις της γλώσσας C.

 

Εγώ πάλι, αντίθετα με σένα, από το λίγο χρόνο που έχω αφιερώσει στο παρόν υποφόρουμ του προγραμματισμού, έχω παρατηρήσει ότι τα post του defacer (όπως φυσικά και του Παπί και του DirectX και πολλών άλλων) είναι τεχνικώς άρτια και πολλές φορές περιέχουν την πιο δόκιμη λύση από τις Ν λύσεις που έχει το πρόβλημα. Κάθε άλλο από αρλούμπες δηλαδή.

 

Αν ο defacer απαντά to the point που λένε στο χωριό μου χωρίς σάλτσες και αν αυτό θεωρείται από πολλούς ύφος ή όχι και αν κάποιοι προσβάλλονται είναι τελείως διαφορετικό θέμα. Υπάρχουν άτομα που τους λες καλημέρα και προσβάλλονται. Εγώ βλέπω ότι τα post που γράφει απαντούν με λογική και επιχειρήματα σε αυτό που ρωτάνε οι OP. Από εκεί και πέρα να μην τον κάνεις έξω παρέα και αν γίνει ποτέ meeting του παρόντος υποφόρουμ να μην τον καλέσετε για μπύρες.

 

Edit: Σου είπε ένα απλό "κάνεις λάθος" (στο οποίο είχε και δίκιο) και αντί να αντικρούσεις αυτό που είπε, εσύ άρχισες τους προσωπικούς χαρακτηρισμούς (snoob, wannabe επιστήμονας). Ίσως σε κρίνω άδικα μια και δεν έχω διαβάσει άλλα post σου για να έχω καλύτερη εικόνα αλλά τουλάχιστον στο συγκεκριμένο νήμα, το ύφος σου είναι χειρότερο από οποιοδήποτε post του defacer έχω διαβάσει (και ήμουν παρών στις μάχες με migf1).

 

Επίσης απόφυγε τις γενικεύσεις τύπου "δεν θέλουμε επιστημονικές απαντήσεις". Είσαι εκπρόσωπος όλου του φόρουμ και μιλάς για εμάς ? Εγώ προσωπικά θέλω επιστημονικές απαντήσεις.

  • Like 3
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@Imitheos

 

 

Και όμως φιλαράκι εσύ είσαι αυτός που δεν κατάλαβες και πρέπει να το ξαναδιαβάσεις. Το γράφεις κιόλας και εσύ ότι ρωτάει για το struct. Ανεξάρτητα από το μέγεθος κάθε τύπου, σε ένα struct μπορεί να μπει padding ανάμεσα στα μέλη ώστε η προσπέλαση της Χ μεταβλητής να είναι ευθυγραμμισμένη και επίσης μπορεί να μπει padding και στο τέλος της struct ώστε να είναι ευθυγραμμισμένη ολόκληρη η δομή για το ενδεχόμενο να ορίσεις ένα πίνακα από αυτές τις δομές.

Ο OP λοιπόν θέλει να βεβαιωθεί ότι το μέγεθος της δομής θα είναι πάντα 3 όχι γιατί μπορεί να έχει διαφορετικό μέγεθος ο char σε κάποια αρχιτεκτονική αλλά γιατί μπορεί να έχει μπει padding.

Ο int έχει σχεδόν σε όλες τις 32bit και 64bit πλατφόρμες μέγεθος 4, παρόλα αυτά δοκίμασε να μπλέξεις μέσα σε μια δομή chars και ints και θα δεις ότι σε διαφορετικούς compilers θα έχεις διαφορετικό μέγεθος δομής. Ακόμη και στον ίδιο compiler θα έχεις διαφορετικό μέγεθος δομής ανάλογα με το πως θα διατάξεις τα μέλη της δομής. Όλα αυτά ενώ ο char και ο int έχουν σταθερό μέγεθος.

 

Γιατί φυσικά το να πεις κάτι "δικό σου" που έβγαλες από το στομάχι σου έχει μεγαλύτερη αξία από το να αναφέρεις τι λέει το authoritative κείμενο που διέπει τις υλοποιήσεις της γλώσσας C.

Εγώ πάλι, αντίθετα με σένα, από το λίγο χρόνο που έχω αφιερώσει στο παρόν υποφόρουμ του προγραμματισμού, έχω παρατηρήσει ότι τα post του defacer (όπως φυσικά και του Παπί και του DirectX και πολλών άλλων) είναι τεχνικώς άρτια και πολλές φορές περιέχουν την πιο δόκιμη λύση από τις Ν λύσεις που έχει το πρόβλημα. Κάθε άλλο από αρλούμπες δηλαδή.

Αν ο defacer απαντά to the point που λένε στο χωριό μου χωρίς σάλτσες και αν αυτό θεωρείται από πολλούς ύφος ή όχι και αν κάποιοι προσβάλλονται είναι τελείως διαφορετικό θέμα. Υπάρχουν άτομα που τους λες καλημέρα και προσβάλλονται. Εγώ βλέπω ότι τα post που γράφει απαντούν με λογική και επιχειρήματα σε αυτό που ρωτάνε οι OP. Από εκεί και πέρα να μην τον κάνεις έξω παρέα και αν γίνει ποτέ meeting του παρόντος υποφόρουμ να μην τον καλέσετε για μπύρες.

Edit: Σου είπε ένα απλό "κάνεις λάθος" (στο οποίο είχε και δίκιο) και αντί να αντικρούσεις αυτό που είπε, εσύ άρχισες τους προσωπικούς χαρακτηρισμούς (snoob, wannabe επιστήμονας). Ίσως σε κρίνω άδικα μια και δεν έχω διαβάσει άλλα post σου για να έχω καλύτερη εικόνα αλλά τουλάχιστον στο συγκεκριμένο νήμα, το ύφος σου είναι χειρότερο από οποιοδήποτε post του defacer έχω διαβάσει (και ήμουν παρών στις μάχες με migf1).

Επίσης απόφυγε τις γενικεύσεις τύπου "δεν θέλουμε επιστημονικές απαντήσεις". Είσαι εκπρόσωπος όλου του φόρουμ και μιλάς για εμάς ? Εγώ προσωπικά θέλω επιστημονικές απαντήσεις.

 

 

Δεν χρειάζεται να διαβάσω τίποτα... ρώτησε για τον char και του απάντησα... όσο για το padding στις δομές, αυτά είναι παιδικά και τα ξέρει και η κουτσή Μαρία...

 

Μην απαντάς για λογαριασμό άλλου... 

 

authoritative κείμενο? σοβαρα?

 

φίλε μου... άμα είναι να πάρω απάντηση copy/paste από Wikipedia/βιβλια κλπ, δεν μπορώ να τα βρω και μόνος μου? δεν μπορεί κάποιος να τα βρει μόνος του?  ... έλα σε παρακαλώ.... οι κλικες εδω μεσα σας κανουν να λετε μη σωστα πραγματα (το ειπα κομψα)

 

 

 

Εγώ πάλι, αντίθετα με σένα, από το λίγο χρόνο που έχω αφιερώσει στο παρόν υποφόρουμ του προγραμματισμού, έχω παρατηρήσει ότι τα post του defacer (όπως φυσικά και του Παπί και του DirectX και πολλών άλλων) είναι τεχνικώς άρτια και πολλές φορές περιέχουν την πιο δόκιμη λύση από τις Ν λύσεις που έχει το πρόβλημα. Κάθε άλλο από αρλούμπες δηλαδή.

Εγώ πάλι βλέπω απλά άτομα που ξέρουν χ πράγματα και παρουσιάζουν τον εαυτό τους για χ+1000. Πιστεύω πως ο Defacer (δεν θα μιλησω για αλλους) το έχει με τις δημοσιες σχεσεις... ξερει να πουλαει το παιδι... μπορει να σε κανει να πιστεψεις πολλα με τις επιστημονικες απαντησεις (αλλων)....

 

Μην ανοιγουμε θεμα σας παρακαλω. δεν θελω πολεμο εδω μεσα... εγω απλα ειπα οτι βλεπω καποιον σνοοβ που απανταει με wikipedia. Αστα να πανε δλδ...

 

ΥΓ: Δεν τόνισα κάτι... 

δεν είναι κακό να είσαι σνοοβ και να απαντάς με Wikipedia. Είναι κακό όταν το κάνεις αυτό και 'την λες' στον αλλον που μιλάει από πείρα και χωρίς copy/paste. Την λες στον αλλον γιατι θες να φανεις εσυ... πραγματικα φιλε μου ξερω ποτε εχω δικαιο, ξερω ποτε εχω αδικο ξερω ποτε τρολλαρω.... 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ούτε εγώ είμαι του image processing. Πρώτη φορά τυχαίνει να ασχοληθώ. Αν και ο σκοπός της εργασίας δεν είναι αυτός. Τον 2d array τον χρειάζομαι γιατί παίζω με την έννοια των γειτονικών pixels. Θα ρίξω μια ματιά σε αυτά που προτείνεις για να δω αν μπορώ να κερδίσω κάτι από αυτά.

Ειναι ή δεν ειναι image processing; Εαν ειναι, τοτε δεν θες 2d array, αλλα μια pipeline. Θα σου γραψω ενα παραδειγμα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ούτε εγώ είμαι του image processing. Πρώτη φορά τυχαίνει να ασχοληθώ. Αν και ο σκοπός της εργασίας δεν είναι αυτός. Τον 2d array τον χρειάζομαι γιατί παίζω με την έννοια των γειτονικών pixels. Θα ρίξω μια ματιά σε αυτά που προτείνεις για να δω αν μπορώ να κερδίσω κάτι από αυτά.

 

 

Και πρέπει να είναι σε C; MATLAB; Να κάνεις τα πάντα σε 1/102 χρόνο;

 

Επίσης, για θέμα ταχύτητας... μην κάνεις 2D array αλλά 1D. Η προσπέλαση των στοιχείων θα γίνεται με μία μεταβλητή τύπου δείκτη την οποία θα την βάζεις να δείχνει στο offset που θέλεις της μεταβλητής char* (του buffer δηλαδή) και θα διαβάζεις τα στοιχεία. 

 

Ίσως προτιμότερο θα ήταν να φτιάξεις μία function π.χ.

 

 

int getNeighbours(char* dataBuffer, int amountOfNeighbours, char* neighboursValues)

 

και να περνάς τον buffer από το struct σου και να παίρνεις τις τιμές που θέλεις. 

 

 

Υ.Γ. Vector2D, είσαι κλασικό παράδειγμα επαρμένου ανθρώπου που το μόνο που έχει είναι η ιδέα για τον εαυτό του και τίποτα άλλο. Βλέπεις ότι στο λένε τόσοι... και παρόλα αυτά δεν βάζεις το μυαλό σου να σκεφτεί ότι "μα καλά, τόσοι μου το λένε.. μήπως να το δω;". Αλλά, δεν βαριέσαι... ό,τι του αρέσει του καθενός και δεν είναι όλοι για όλες τις δουλειές. 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν χρειάζεται να διαβάσω τίποτα... ρώτησε για τον char και του απάντησα... όσο για το padding στις δομές, αυτά είναι παιδικά και τα ξέρει και η κουτσή Μαρία...

Και όμως είναι χαμηλού επιπέδου λεπτομέρειες που πολλοί που προγραμματίζουν σε C (ειδικά φοιτητές) δεν γνωρίζουν. Άσε που αν τα θεωρείς τόσο παιδικά που πιστεύεις ότι ο OP θα έπρεπε να τα γνωρίζει και απαξιείς να το εξηγήσεις, τότε γιατί έγραψες το post σου ?

 

Μην απαντάς για λογαριασμό άλλου...

Ο καθένας μας είναι ελεύθερος να απαντήσει σε όποιο post θέλει και να κρίνει όποια συμπεριφορά θέλει. Δεν νομίζω στους κανόνες του φόρουμ να λέει "Δεν θα απαντάτε για άλλους".

 

authoritative κείμενο? σοβαρα?

 

φίλε μου... άμα είναι να πάρω απάντηση copy/paste από Wikipedia/βιβλια κλπ, δεν μπορώ να τα βρω και μόνος μου? δεν μπορεί κάποιος να τα βρει μόνος του?  ... έλα σε παρακαλώ....

Πολύ αφοριστικό σε βρίσκω. Μπορεί εσύ να είσαι ο υπερμέγιστος που έχει τεράστιες γνώσεις και έχει στην κατοχή σου όλα τα βιβλία που έχουν εκδοθεί αλλά καλώς ή κακώς υπάρχουν άτομα που δεν γνωρίζουν το πρότυπο της C οπότε δεν μπορούν από μόνοι τους να ψάξουν. Ακόμη και όσοι γνωρίζουν ότι υπάρχει το πρότυπο είναι λίγο δύσκολο να βρουν το κομμάτι που θέλουν και να το ερμηνεύσουν σωστά αν δεν έχουν καλή γνώση της γλώσσας.

 

οι κλικες εδω μεσα σας κανουν να λετε μη σωστα πραγματα (το ειπα κομψα)

Γμτ. Το σκοτεινό μου σχέδιο αποκαλύφτηκε και πάλι. Είμαι μέλος της κλίκας του defacer.

Imitheos: Τι θα κάνουμε απόψε defacer ?

Defacer: Ό,τι κάνουμε κάθε βράδυ. Θα κατακτήσουμε το insomnia.

πραγματικα φιλε μου ξερω ποτε εχω δικαιο, ξερω ποτε εχω αδικο ξερω ποτε τρολλαρω....

Αν ήταν αλήθεια αυτό, τότε θα ήξερες ότι τώρα έχεις άδικο. Τέλος πάντων, αρκετά ασχολήθηκα και δεν θέλω να εκτροχιάσω ακόμη ένα νήμα. Ο OP πήρε την απάντηση που έπρεπε οπότε σκάω μέχρι να ρωτήσει κάτι νέο και αναμένω να διαβάσω το παράδειγμα του παπί που σε αντίθεση με τα δικά μας post, θα έχει καλογραμμένο κώδικα και θα δώσει κάτι στο νήμα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

@Vector2D:

 

Δεν νομίζω να υπάρχει μέλος του φόρουμ που να έχει τον defacer στη μπούκα περισσότερο από μένα, και παρόλο που διαπίστωσα πως συμπίπτουμε σε αρκετά από τα προσωπικά μας συμπεράσματα, στο παρόν νήμα εσύ είσαι εκείνος που απάντησε "αρλούμπες". Άλλο ρώτησε ο OP, σε άλλο απάντησες εσύ (ο defacer απάντησε σε αυτό που ρώτησε ο OP). Για το ύφος του, προφανώς και συμφωνούμε αλλά είναι δευτερευούσης σημασίας.

 

 

 

@OP:

 

Σχετικά με τους γείτονες, στη C που υλοποιεί row-major-order πίνακες, μπορείς να προσπελάσεις έναν 1D array[n] σαν 2D array[j] ως εξής:

#define I_(n, ncols)     ( (ncols) != 0 ? (n) / (ncols) : 0 )
#define J_(n, ncols)     ( (ncols) != 0 ? (n) % (ncols) : 0 )
...
const unsigned int N = nrows * ncols;
Whatever *array = calloc( N, sizeof(*array) ); /* in real code, also check for failure */
for (unsigned int n=0; i < N; n++) {
    unsigned int row = I_( n, ncols );
    unsigned int col = J_( n, ncols );
    printf( "%u -> [%u,%u]\n", n, row, col );
    /* do what you need to do with array[n] */
}
free( array );
/*
i = n / ncols;
j = n % ncols;
*/

Επίσης:

#define N_(i,j, ncols)  ( (i) * (ncols) + (j) )
...
const unsigned int N = nrows * ncols;
Whatever *array = calloc( N, sizeof(*array) ); /* in real code, also check for failure */
for (unsigned int i=0; i < nrows; i++) {
    for (unsigned int j=0; j < ncols; j++) {
        unsigned int n = N_( i,j, ncols );
        printf( "[%u,%u] -> %u\n", i,j, n );
        /* do what you need to do with array[n] */
    }
}
free( array );
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 



I could not resist.

#1

Πολύ φιλικά φίλε μ, γενικά βλέπω ότι ο χαρακτήρας σου είναι πολύ... πως να το πω... Snoob...?

 


#2

... όσο για το padding στις δομές, αυτά είναι παιδικά και τα ξέρει και η κουτσή Μαρία...

 



 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

 

Ίσως σε κρίνω άδικα μια και δεν έχω διαβάσει άλλα post σου για να έχω καλύτερη εικόνα

http://www.insomnia.gr/topic/578295-%CE%B3%CF%85%CE%BD%CE%B1%CE%AF%CE%BA%CE%B5%CF%82-%CE%BA%CE%B1%CE%B9-%CF%84%CE%B5%CF%87%CE%BD%CE%BF%CE%BB%CE%BF%CE%B3%CE%AF%CE%B1/page-8#entry54197867 
Κάτι σε Star_Light μου φέρνει. :)

 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ερώτηση ίσως λίγο άσχετη προς την συζήτηση αλλά, πέρα από κάποια επιτάχυνση που ίσως έχει το πρόγραμμα στο τρέξιμο του αν η memory είναι alligned, υπάρχει περίπτωση να μην "τρέχει" σε κάποια αρχιτεκτονική; Δηλαδή ποια είναι τα χαρακτηριστικά αυτής της αρχιτεκτονικής που θα έκανε ένα πρόγραμμα που κάνει access σε μη aligned μνήμη να μην τρέχει καν;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ερώτηση ίσως λίγο άσχετη προς την συζήτηση αλλά, πέρα από κάποια επιτάχυνση που ίσως έχει το πρόγραμμα στο τρέξιμο του αν η memory είναι alligned, υπάρχει περίπτωση να μην "τρέχει" σε κάποια αρχιτεκτονική; Δηλαδή ποια είναι τα χαρακτηριστικά αυτής της αρχιτεκτονικής που θα έκανε ένα πρόγραμμα που κάνει access σε μη aligned μνήμη να μην τρέχει καν;

Σε x86 υπάρχει κύκλωμα που μπορεί να κάνει προσπέλαση σε μη-aligned διευθύνσεις απλά υπάρχει μικρότερη ταχύτητα. Υπάρχουν όμως αρχιτεκτονικές (risc και μη) που μπορούν να κάνουν μόνο aligned προσπέλαση αλλιώς το πρόγραμμα κρασάρει με μήνυμα bus error.

 

Δεν είναι δηλαδή έτσι που το είπες ότι υπάρχει μια μικρή πιθανότητα να μην τρέχει αν πας να το τρέξεις σε κάποια τρελή αρχιτεκτονική αλλά αντίθετα υπάρχουν γνωστές και ευρέως χρησιμοποιούμενες αρχιτεκτονικές στις οποίες δεν θα παίζει.

 

Αν διαβάσεις το άλλο μήνυμα που έδωσε ο gon1332, είχα γράψει ένα χαζό προγραμματάκι που με την χρήση assembly έγραφε στον καταχωρητή σημαιών και απενεργοποιούσε αυτή τη δυνατότητα οπότε η un-aligned προσπέλαση κράσαρε και σε x86.

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σε x86 υπάρχει κύκλωμα που μπορεί να κάνει προσπέλαση σε μη-aligned διευθύνσεις απλά υπάρχει μικρότερη ταχύτητα. Υπάρχουν όμως αρχιτεκτονικές (risc και μη) που μπορούν να κάνουν μόνο aligned προσπέλαση αλλιώς το πρόγραμμα κρασάρει με μήνυμα bus error.

 

Δεν είναι δηλαδή έτσι που το είπες ότι υπάρχει μια μικρή πιθανότητα να μην τρέχει αν πας να το τρέξεις σε κάποια τρελή αρχιτεκτονική αλλά αντίθετα υπάρχουν γνωστές και ευρέως χρησιμοποιούμενες αρχιτεκτονικές στις οποίες δεν θα παίζει.

 

Αν διαβάσεις το άλλο μήνυμα που έδωσε ο gon1332, είχα γράψει ένα χαζό προγραμματάκι που με την χρήση assembly έγραφε στον καταχωρητή σημαιών και απενεργοποιούσε αυτή τη δυνατότητα οπότε η un-aligned προσπέλαση κράσαρε και σε x86.

Αν κάνεις compile τον κώδικα για την αντίστοιχη αρχιτεκτονική που θες εσύ (συγκεκριμένα για μια υποθέτοντας ότι σου δίνεται αυτή η δυνατότητα από τον compiler) μπορείς πάντα να αποφύγεις το memory un-allignment για το δικό σου πρόγραμμα; Και λέω για το δικό σου πρόγραμμα γιατί στο documantation του linux kernel για το memory allignment αναφέρει ότι υπάρχουν συναρτήσεις που δεν εγγυώνται memory allignment.  

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν κάνεις compile τον κώδικα για την αντίστοιχη αρχιτεκτονική που θες εσύ (συγκεκριμένα για μια υποθέτοντας ότι σου δίνεται αυτή η δυνατότητα από τον compiler) μπορείς πάντα να αποφύγεις το memory un-allignment για το δικό σου πρόγραμμα;

Αν γράφεις εσύ τον κώδικα μπορείς να κάνεις ό,τι θέλεις. Το γεγονός ότι υπάρχουν κώδικες που χρησιμοποιούν μη-aligned προσπελάσεις στη πλειοψηφία των περιπτώσεων είναι είτε γιατί αυτός που το γράφει δεν έχει επαφή με άλλες αρχιτεκτονικές και δεν έχει καν υπόψην του ότι μπορεί κάπου αλλού να μην παίζει (δυστυχώς αυτό συμβαίνει σε πολλούς τομείς και όχι μόνο στην alignment επειδή η x86 συγχωρεί πάρα πολλά) ή από βαρεμάρα. Δεν περιμένεις ότι θα τρέξει κάποιος το πρόγραμμα σε άλλη αρχιτεκτονική και είναι πολύ πιο βολικό και γρήγορο να το κάνεις pack από το να κάτσεις να το υλοποιήσεις σωστά. Αυτό ισχύει ειδικά σε binary formats. Παλαιότερα πολλοί savegame editors, image viewers, κτλ όριζαν μια δομή με όλα τα μέλη και την δήλωναν packed ώστε να κάνουν κατευθείαν ένα fread και να διαβάσουν με τη μία τα δεδομένα που ήθελαν.

 

Και λέω για το δικό σου πρόγραμμα γιατί στο documantation του linux kernel για το memory allignment αναφέρει ότι υπάρχουν συναρτήσεις που δεν εγγυώνται memory allignment.

Δεν καταλαβαίνω εδώ τι εννοείς. Το πρότυπο της C λέει ότι η malloc και λοιπές συναρτήσεις θα σου δώσουν πάντα μνήμη ευθυγραμμισμένη για κάθε τύπο. Λέγοντας "κάθε τύπο" εννοούν τους βασικούς τύπους οπότε σε x86 τουλάχιστον 64bit ευθυγράμμιση είναι εγγυημένη.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...